我对
之间的区别感到有些困惑leal -4(%ebp), %eax
和
movl -4(%ebp), %eax
有人可以向我解释一下吗?
答案 0 :(得分:40)
LEA(加载有效地址)只计算操作数的地址,它实际上不会取消引用它。大多数情况下,它只是进行计算,比如数组索引的组合乘法和加法。
在这种情况下,它正在进行简单的数字减法:leal -4(%ebp), %eax
只是为%eax
寄存器分配%ebp - 4
的值。它等同于单个sub
指令,但sub
要求目标与其中一个源相同。
movl
指令访问%ebp - 4
处的内存位置,并将该值存储到%eax
。
答案 1 :(得分:7)
如果您希望以不同的编程语言来看待这一点,那么:
int var;
[ ... ]
func (var, &var);
评估以下(Linux x86_64)汇编代码:
[ ... ] 4: 8b 7c 24 0c mov 0xc(%rsp),%edi 8: 48 8d 74 24 0c lea 0xc(%rsp),%rsi d: e8 xx xx xx xx callq ... <func> [ ... ]
由于%rdi
/ %rsi
是1 st / 2 nd 参数,您可以看到lea ...
检索< em>地址 &var
变量,而mov ...
加载/存储值 var
。
即。在汇编中,使用lea
而不是mov
类似于在C / C ++中使用&
运算符的地址,而不是变量本身的(值)。
lea
的用途远不止于此,但您明确询问了两者之间的区别。
例如:带有内存操作数的mov
始终执行内存访问(加载或存储),而lea
的内存操作数仅被视为指针算术 - 即计算并解析地址,但指令本身不会发生内存访问。这两个:
lea 1234(%eax, %ebx, 8), %ecx
movl (%ecx), ecx
结果与:
相同movl 1234(%eax, %ebx, 8), %ecx
而以下内容:
leal (%eax, %eax, 4), %eax
将%eax
中的值乘以五。
答案 2 :(得分:1)
相当于英特尔语法中的LEA
,加载有效地址(长?)。
答案 3 :(得分:-1)
LEA和MOV都可以加载带偏移的寄存器到a 例如变量。
MOV还可以将内存位置的内容传输到寄存器LEA 可&#39;吨。 LEA&amp; MOV可以计算&#34;有效抵消&#34;这可以用来做 数学更有效