回答
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