esp暫存器與ebp暫存器介紹
esp暫存器與ebp暫存器介紹
2013年09月21日 03:04:15 傷心小鴕鳥 閱讀數:974
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/westboy666/article/details/11858225
ESP
ESP(Extended stack pointer)是指標暫存器的一種(另一種為EBP)。用於堆疊指標。
ESP為棧指標,用於指向棧的棧頂(下一個壓入棧的活動記錄的頂部),而EBP為幀指標,指向當前活動記錄的頂部。
棧指標與幀指標標識出了當前活動記錄的位置。
當函式被呼叫的時候,執行如下操作:
⒈將幀指標壓入棧中:push ebp
⒉用ebp儲存當前棧指標:mov ebp,esp ( 彙編程式碼最為常見的是ATT和intel彙編程式碼格式,運算元的循序相反,此處不知 //是那種彙編程式碼格式?我經常是這樣寫:mov esp, ebp:它的意思是把當前的棧指標 // 暫存器esp中的地址儲存到幀指標暫存器ebp中。)
⒊使得棧指標自減,自減得到的記憶體應當能夠被用來儲存被呼叫函式的本地狀態:sub 0CCh,esp
EBP
擴充套件基址指標暫存器(extended base pointer) 其記憶體放一個指標,該指標指向系統棧最上面一個棧幀的底部。
每個任務(程序)有一個棧(是不是可以這樣理解一個程式中只有一個棧,每個函式對應一個棧中一段區域即幀),在這個程序中每個函式被呼叫時分別從這個棧佔用一段區域,稱為幀(frame)。%esp暫存器指向當前整個棧的棧頂,% ebp指向當前幀的幀底。上一級呼叫者的幀底被壓入當前%ebp內容所指的地址,也就是當前幀的幀底位置儲存了上一級呼叫者的%ebp指標值(幀底),而每個%ebp的前一個單元存放
在函式棧幀中,一般包含以下幾類重要資訊。 (1)區域性變數:為函式區域性變數開闢的記憶體空間。 (2)棧幀狀態值:儲存前棧幀的頂部和底部(實際上只儲存前棧幀的底部,前棧幀的頂部可以通過棧幀平衡計 算得到),用於在本棧被彈出後恢復出上一個棧幀。 (3)函式返回地址:儲存當前函式呼叫前的“斷點”資訊,也就是函式呼叫前的指令位置,以便在函式返回 時能夠恢復到函式被呼叫前的程式碼區中繼續執行指令。
注:函式棧幀的大小並不固定,一般與其對應函式的區域性變數多少有關。函式執行過程中,其棧幀大小也是 在不停變化的。 除了與棧相關的暫存器外,我們還需要記住另一個至關重要的暫存器。 EIP:指令暫存器(extended instruction pointer),其記憶體放著一個指標,該指標永遠指向下一條等待 執行的指令地址。 可以說如果控制了EIP暫存器的內容,就控制了程序——我們讓EIP指向哪裡,CPU就會去執行哪裡的指令。