關於調用幀中的棧

關於調用幀中的棧

寫這篇文章,我想說明一些看起來不復雜,但要花些時間反應的問題。

Q: esp指向哪?
A: 就是棧頂,而不是棧頂的下一個元素。

Q: 如何在windbg中查看當前棧?
A: dp esp. p意指 Pointer-sized. 單列模式格式: dp /c1 esp
因爲棧是向下生長的,dp是向上顯示的,所以dp esp從棧頂開始,向上顯示的內存,剛好就是棧的內容。

Q: call指令做了些什麼事?
A: call做的僅僅是把返回地址(call的下一條指令的地址)壓棧,然後跳轉到目標地址。
它不會爲參數壓棧,也不會保存其它寄存器,更不好爲局部變量分配棧空間。這些事都是程序員乾的,或是編譯器自動完成的。

Q: 爲什麼需要ebp?
A:
esp雖然是棧指針,但它是遊動的,只要代碼中有棧操作,它就隨棧頂變量而變化。在引用局部變量(局部變量存放在脆弱的棧中)時,極不方便。
引入ebp,固定指向調用幀,方便引用局部變量。當然ebp需要手動指定。所以函數開頭經常可見如下代碼:

push ebp     
move ebp esp

調用幀一般結構:

|             | High
| Parameter   |
|-------------|
| Parameter   |
|-------------|
| Return Addr |
|-------------|
| Old ebp     | <-- New ebp
|-------------|
| Local var   |
|-------------|
| Local var   |
|             | Low



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章