2014-02-06 54 views
1

我讀例如 「LEA EAX,[EBP - 120]」 基本上是指lea指令如何與esp交互?

mov eax, ebp 
sub  eax, 120 

給出的例子中,所述ESP是在EBP-200,然後在後面的功能

lea eax, [ebp - 120] 
push eax 
call xyz 

這是否意味着ebp-120的值被加載到eax寄存器中,然後這個4字節的值被壓入棧中?或者這意味着esp會進一步減少120,從而創建從ebp-200到ebp-320的緩衝區,尤其是在ebp-320?

+1

你的第一個解釋是正確的。 –

+0

'push eax'將'eax'寄存器的內容壓入堆棧。 –

+0

代碼傳遞一個指向局部變量的指針。存儲在ebp-120主叫方的堆棧幀中。很常見。與esp沒有任何關係,除了在調用者的函數入口處,esp值需要被調整以爲局部變量留出空間。許多教程和書籍都很好地描述了堆棧框架的工作方式。 –

回答

1

What's the purpose of the LEA instruction?

LEA看起來比MOV更看中的,但實際上它只做一部分MOV做什麼:MOV計算的地址和取消引用的內存,LEA纔算地址。

在您的例子,EAX接收存儲在EBP 120減去的值,而不是在值被存儲在EBP與120減去地址存儲。該值繼續被推入堆棧。如果這個程序集對應於C代碼,那麼eax/stack將包含一個指向某個變量的指針。

lea和esp之間沒有直接的相互作用。除非esp是lea的論點之一,否則lea不會讀取或修改esp。

+0

我喜歡解釋它說'lea'是一個移位和添加指令,恰好碰巧使用內存地址語法和機器代碼。 –