在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。

例如:

MOV AX,2000H;将16位数据2000H传送到AX寄存器
MOV AL,20H;将8位数据20H传送到AL寄存器
MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
MOV AL,[2000H];将2000H单元的内容传送到AL寄存器

需要注意的是:

(1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV [SI],[2000H];这是错误的
(2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV IP,2000 H ;这是错误的
(3)CS和IP不能作为目的操作数。MOV CS,AX ;这是错误的
(4)MOV指令中立即数不能作目标操作数。MOV 2000H,[SI] ;这是错误的

但是注意

*(1) MOV指令中的源操作数绝对不能是立即数和代码段CS寄存器;
(2) MOV指令中绝对不允许在两个存储单元之间直接传送数据;
(3) MOV指令中绝对不允许在两个段寄存器之间直接传送数据;
(4) MOV指令不会影响标志位*

例:MOV AX,DATA_SEG

MOV DS,AX

注意:段寄存器(段地址)必须通过寄存器如AX寄存器进行立即数的初始化。

例: MOV AL,‘E'

把立即数(字符E的ASC码)送到AL寄存器。
例: MOV BX,OFFSET TABLE
将TABLE的偏移地址(而不是内容)送到BX寄存器中。其中OFFSET为属性操作符,表示的是将其后的符号地址的值(不是内容)作为操作数。
例 MOV AX,Y[BP][SI]
把地址为16d×(SS)十(BP)十(SI)十位移量Y的存储单元的内容送给AX寄存器

PS:下面看下汇编中的mov指令的基本使用

但是我用gcc反汇编如下函数

 int test() { return 2; }

得到的汇编代码却是

 _add: LFB7: .cfi_startproc movl $2, %eax ;//将eax内容复制到2中???显然不对啊 ret .cfi_endproc

总结

您可能感兴趣的文章:

  • 常用的汇编指令与技巧(收藏)
  • 汇编语言中mov和lea指令的区别详解
  • 汇编语言lea指令使用方法解析
  • 详解汇编语言 dup伪指令
  • 汇编语言中cmp指令用法笔记与总结
  • 详解汇编语言MOV指令
  • 汇编语言乘指令 MUL、IMUL的具体使用
  • 详解汇编语言各种指令的解释与用法
  • 汇编语言指令大全 X86和X87汇编指令大全(带注释)
  • 汇编语言中move指令的使用