2012-06-26 160 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

與其他三年來的答案相比,這並不是很有用。我建議你嘗試回答相對較新的問題,或者沒有被接受的答案,除非你有一些真正新穎和有用的東西添加。 –