2011-03-20 121 views
0

有疊加成形是堆疊外形

Parameter #N 
... 
... 
Parameter 2 
Parameter 1 
Return Address 
Old %ebp 
Local Variable 1 
Local Variable 2 


I have no idea what `"Old %ebp"` for. 

如果%ebp用於訪問返回地址和參數,那麼爲什麼不%ebp點只是

返回地址,而不是"Old %ebp"

是否適合未來用途?

我的問題是

  • Q1。什麼是「舊%ebp」,它是什麼?第二季度銷售價格爲
  • 。爲什麼%ebp指向舊%ebp不只是返回地址?

回答

3

ebp寄存器(基址指針)通常用於處理堆棧幀(堆棧的不同「級別」)。雖然堆棧指針可以根據您推送和彈出的內容進行更改,但基本指針在相同堆棧級別時保持不變。

這樣的話,你可以在所有的局部變量得到的ebp一側(例如,mov ax,[ebp-8])和所有在另一邊傳遞的參數(例如,mov ax,[ebp+12]),以及是相對於ebp任何其他地點,如某些情況下的返回碼。

您之所以擁有之前的推送到堆棧上的基本指針的內容是這樣,當您移動到前一個堆棧幀時,很容易恢復該值。您只需將該值輸入ebp並將其恢復,即可以訪問當地人併爲下一級傳遞參數。

This article提供了它如何能工作的圖形概覽,這是我經常發現無價:

+------------------+ 
+-> | prev-prev EBP | 
| +------------------+ 
| | function param 2 | 
| +------------------+ 
| | function param 1 | 
| +------------------+ 
| | return address | 
| +------------------+ 
+---| previous EBP | <-- current EBP 
    +------------------+ 
    | local var 1 | 
    +------------------+ 

它的工作方式是,你推參數的功能,那麼你只需要調用該函數。在函數開始時的序言代碼是一樣的東西:

push ebp   ; save old base pointer. 
mov ebp, esp  ; set new copy. 
sub esp, 16h  ; allocate space for local variables. 

其保存舊ebp並建立一個新的,指向由調用代碼推變量。從堆棧指針中減去是爲本地分配空間。

如上所述,這意味着通過參數可以得到與[ebp+N]和當地人與[ebp-N]

的收尾代碼是相反的操作:

add esp, 16h  ; forget about locals. 
pop ebp   ; restore previous value 
ret    ; return to calling code. 

之後ebp現在被設置爲它的先前值。

0

%ebp是基址指針,所有參數和局部變量都作爲基址指針的偏移量來訪問。當前的ebp將指向堆棧,具有old %ebp

例如Local Variable 1 is stored at %ebp-4parameter 1 is stored at %ebp+8

"Old %ebp"是調用者函數的基址指針,當calle返回基址指針時,舊調用者被恢復。

要回答第二個問題,它可以做到這一點,但這是慣例。部分是這樣的。

push %ebp ; save old ebp to stack, this will become old ebp 
    mov %esp, %ebp ; moving current base pointer to epp 

PS:我主要使用NASM語法,因此可能是