寄存器與函數棧幀之整理篇


       轉載自:點擊打開鏈接http://blog.csdn.net/PenglueR/article/details/5203738


       

每個任務(進程)有一個棧,在這個進程中每個函數被調用時分別從這個棧佔用一段區域,稱爲幀(frame)。%esp寄存器指向當前整個棧的棧頂,% ebp指向當前幀的幀底。上一級調用者的幀底被壓入當前%ebp內容所指的地址,也就是當前幀的幀底位置保存了 上一級調用者的%ebp指針值(幀底),而每個%ebp的前一個單元存放的就是當前函數的返回地址(它是由調用者在call指令中入的棧),保證是在上以 及幀的最後一個空間單元。這樣就可以
根據當前%ebp的值回溯出整個任務的調用棧(調用過程)。

在函數棧幀中,一般包含以下幾類重要信息。
(1)局部變量:爲函數局部變量開闢的內存空間。
(2)棧幀狀態值:保存前棧幀的頂部和底部(實際上只保存前棧幀的底部,前棧幀的頂部可以通過棧幀平衡計
算得到),用於在本棧被彈出後恢復出上一個棧幀。
(3)函數返回地址:保存當前函數調用前的“斷點”信息,也就是函數調用前的指令位置,以便在函數返回
時能夠恢復到函數被調用前的代碼區中繼續執行指令。
注:函數棧幀的大小並不固定,一般與其對應函數的局部變量多少有關。函數運行過程中,其棧幀大小也是
在不停變化的。
除了與棧相關的寄存器外,我們還需要記住另一個至關重要的寄存器。
EIP:指令寄存器(extended instruction pointer),其內存放着一個指針,該指針永遠指向下一條等待
執行的指令地址,其作用可參考【指令寄存器EIP的作用(圖2)】來理解。
可以說如果控制了EIP寄存器的內容,就控制了進程——我們讓EIP指向哪裏,CPU就會去執行哪裏的指令。

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