LEAL汇编指令有什么作用?

时间:2012-06-26 17:06:29

标签: c assembly

我对

之间的区别感到有些困惑
leal -4(%ebp), %eax       

movl -4(%ebp), %eax

有人可以向我解释一下吗?

4 个答案:

答案 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;这可以用来做 数学更有效