2011-12-02 152 views
16

我目前正在學習用於Intel處理器的彙編語言。 由於棧「向下增長」,爲什麼我們要以訪問特定的元素彙編寄存器esp和ebp

[ebp + 8] ;; This will access the first param 

我konw我們要跳過舊的EBP值和返回地址添加,這就是爲什麼我們使用8(因爲每個長度都是4個字節)。 這有點奇怪。

而且,如果EBPESP備份副本,什麼是EBP的主功能 防爆值:

_start: 

;; what's ebp value here ? 

push eax 
push ebx 
call someFunction ;; this will create a stack frame 

+-----------+ 
| param1 | 
+-----------+ 
| param0 | <--- this is [ebp + 8] (assuming mov ebp, esp) 
+-----------+ 
|ret_address| 
+-----------+ 
| ebp | 
+-----------+ <--- esp 

而且還當我們當地人分配內存,我們必須。減去從ebp ... 請給出一個不含糊的答案。 謝謝!

+1

main()函數與常規函數沒有區別,它也有序幕。你沒有在你的程序集片段中顯示一個,不知道爲什麼。本地人的空間是通過調整esp而不是ebp來創建的。 –

+0

還有同樣的問題:http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point和其他鏈接到它 – Abyx

回答

2

正如你所說,堆棧增長下降。所以,你減去增加本地人的堆棧。您可以添加回看堆棧中存儲的元素。

13

%ebp的初始值通常爲0.這就是調試器知道何時結束跟蹤回溯鏈中的鏈。

您應該將%ebp作爲參考點。爲了方便,它被放置在函數參數和局部變量之間。這樣,您可以訪問具有正偏移量的參數,以及具有負偏移量的變量,因此很容易判斷您是在訪問變量還是參數。

+0

爲什麼0? CPU開機時初始化? – Abyx

+0

'%ebp'通常由加載器或運行時庫初始化爲0。初始化爲0有時在正式文檔中指定(例如:ELF x86 psABI指定的IIRC)。 – ninjalj

+0

什麼加載程序或什麼運行時?如果您正在討論特定的操作系統,請明確說明。在我的操作系統中'ebp'沒有初始化爲0,至少在用戶模式下。另外,確切地說,寄存器名稱是'ebp',而不是'%ebp'。 '%'是寄存器名稱的前綴。 – Abyx