Home ASM 汇编中中括号[]作用以及lea和mov指令的区别

汇编中中括号[]作用以及lea和mov指令的区别

by zinan

现在总结一下:其中牵扯到lea指令,mov指令,[]

一.lea指令:
对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:
mov eax,2
lea ebx,[eax];执行后ebx=2
mov ebx,eax;等同于上句
lea ebx,eax;编译器报错: error A2070: invalid instruction operands

对于变量来说加不加[]都是一样的效果,都是取变量的地址,相当于指针
如:
num dword 2
lea ebx,num
lea eax,[num]; eax为num的地址,如eax=4206598,随程序不同不同,这时ebx==eax

二.mov指令:
对于变量来说
num dword 2
mov eax,2
mov ebx,num
mov ecx,[num];执行完ebx==ecx==2

对寄存器
mov ebx,eax;ebx==2
mov ecx,[eax];可能会报错,因为这里翻译成汇编是mov ecx,DS:[eax]

总的说来加不加中括号[]的区别就是:
lea对变量没有影响是取地址,对寄存器来说加[]时取值,第二操作数不加[]非法

mov对变量来说没有影响是取值,对寄存器来说是加[]时取地址,第二操作数不加[]是取值


还有一点这里顺便说下,看有的教程说mov指令不支持mov ebx,[eax+2*eax……什么乱七八糟的表达式]归根结底就是对于mov来说当第二个操作数是寄存器的时候如果加上[]就是寻址了….

打赏
2 comments

You may also like

2 comments

luzhlon 2014年10月15日 - 上午8:42

[F1] [F1] [F1]
机器指令,分操作码和操作数。映射成汇编指令,像mov,jmp,lea,cmp…这样的叫操作码,后面跟着的是操作数。其中操作数又分源操作数和目的操作数,如mov eax,ebx 其中eax是目的操作数,ebx是源操作数。一条汇编(机器)指令中,操作码是必须的,而操作数是可选的。说到操作数,又要提到寻址方式。
例子 源操作数寻址方式
mov eax,5 立即数寻址
mov eax,[400000h] 直接寻址
mov eax,ebx 寄存器寻址
cmp ecx,[eax] 寄存器间接寻址
lea ebx,[eax+4] 寄存器相对寻址
jmp [eax+ebx*x] 相对变址寻址(其中x只能为0,1,2,4.正好用两个比特位表示)
add eax,[eax+ebx*x+4] 相对基址变址寻址
……
以上只是x86系列CPU 的寻址方式,对于其它的CPU(如ARM),还有更多的寻址方式可以选择。
个人认为,lea指令的作用是把源操作数的地址送入目的操作数中。
另外学哥你说的变量是直接寻址的一种简化写法(全局变量),比如mov eax,num 其中num是[xxxxxxxx]的一种简化写法。
lea指令通常有两个作用,一个是取指针;另一个是便于计算复杂的算式,如lea [eax*4+ebx+1000]一条指令
就完成了加法和乘法的运算(当然这种运算是有限制的)。

Reply
Wayne 2014年10月16日 - 上午7:02

@luzhlon:谢谢,讲解的很清楚。 [F4]

Reply

Leave a Comment

*

code

error: 未经允许禁止转载!