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
現在被設置爲它的先前值。