回答
LEA(加载有效地址)只是计算操作数的地址,它实际上并没有对其进行解引用。大多数时候,它只是做一个像数组索引这样的组合乘法和加法运算。
在这种情况下,它正在做一个简单的数字减法:leal -4(%ebp), %eax
只给%eax
寄存器的值%ebp - 4
。它相当于一个sub
指令,除了sub
要求目标与其中一个源相同。
movl
指令相反,访问存储器位置%ebp - 4
并将该值存储到%eax
。
当我看到它将eax寄存器设置为结果时,我有种理解。 –
Equiliblent to LEA
in Intel syntax,load effective address(long?)。
如果你想看看这个不同的编程语言方面,则:
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
是st/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
值。
LEA和MOV都可以加载一个寄存器,其偏移量例如为 。
MOV还可以将内存位置的内容传送到寄存器,LEA 不能。 两个LEA & MOV可以计算可以用来做 数学更有效的“有效的补偿”
与其他三年来的答案相比,这并不是很有用。我建议你尝试回答相对较新的问题,或者没有被接受的答案,除非你有一些真正新颖和有用的东西添加。 –
- 1. 为什么这个IA32汇编代码有三条leal指令?
- 2. “leal 0x10(%ebx),%eax”x86汇编指令中的0x10是什么?
- 3. IA32汇编代码Y86汇编代码:leal指令
- 4. “rep stos”x86汇编指令序列的作用是什么?
- 5. 编码汇编指令操作码来
- 6. Go的汇编器有什么条件跳转指令?
- 7. “set_w”和“set_sw”汇编语言命令有什么作用?
- 8. ARM汇编指令
- 9. MSP430汇编指令
- 10. smulwb汇编指令
- 11. 汇编/拆卸指令操作数
- 12. 汇编 - 比较指令不工作
- 13. imul汇编指令 - 一个操作数?
- 14. -l指令有什么作用?
- 15. 这组指令有什么作用?
- 16. 8086汇编mov指令没有错误
- 17. 汇编mips指令lbu
- 18. ARM汇编“retne”指令
- 19. 汇编比较指令
- 20. 汇编语言指令
- 21. PIC16F84A指令BSF - 汇编
- 22. 内联汇编,out指令
- 23. pusha汇编语言指令
- 24. 解释汇编指令
- 25. 困惑的汇编指令
- 26. ARM汇编 - 分支指令
- 27. 汇编指令STRB的ARMv7
- 28. 汇编语言指令
- 29. Powerpc汇编指令bl SYM
- 30. 有什么JVM汇编器?
相关:http://stackoverflow.com/questions/4003894/leal-assembler-instruction – mensi
和那种重复: http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction – mensi
线索就是这个名字。负载有效地址只加载地址。 – harold