2012-06-26 127 views
12

我感到有点困惑LEAL汇编指令有什么作用?

leal -4(%ebp), %eax  

movl -4(%ebp), %eax 

之间的差异有人可以解释这样对我?

+2

相关:http://stackoverflow.com/questions/4003894/leal-assembler-instruction – mensi

+2

和那种重复: http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction – mensi

+1

线索就是这个名字。负载有效地址只加载地址。 – harold

回答

25

LEA(加载有效地址)只是计算操作数的地址,它实际上并没有对其进行解引用。大多数时候,它只是做一个像数组索引这样的组合乘法和加法运算。

在这种情况下,它正在做一个简单的数字减法:leal -4(%ebp), %eax只给%eax寄存器的值%ebp - 4。它相当于一个sub指令,除了sub要求目标与其中一个源相同。

movl指令相反,访问存储器位置%ebp - 4并将该值存储到%eax

+0

当我看到它将eax寄存器设置为结果时,我有种理解。 –

1

Equiliblent to LEA in Intel syntax,load effective address(long?)。

3

如果你想看看这个不同的编程语言方面,则:

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/%rsist/2 nd的论点,你可以看到lea ...检索到地址&var的一个变量,而mov ...加载/存储的var相同。

I.e.在汇编中,使用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值。

0

LEA和MOV都可以加载一个寄存器,其偏移量例如为 。

MOV还可以将内存位置的内容传送到寄存器,LEA 不能。 两个LEA & MOV可以计算可以用来做 数学更有效的“有效的补偿”

+0

与其他三年来的答案相比,这并不是很有用。我建议你尝试回答相对较新的问题,或者没有被接受的答案,除非你有一些真正新颖和有用的东西添加。 –