1. 程式人生 > >esp暫存器與ebp暫存器介紹

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的前一個單元存放

的就是當前函式的返回地址(它是由呼叫者在call指令中入的棧),保證是在上以及(應改為:一級)幀的最後一個空間單元(也就說“返回地址”的空間單元的位置在每個幀中都有,譬如說:main()函式的幀中也有“返回地址”空間單元,單元中的內容是call指令發生時自帶的一個命令動作,這個動作就是把call指令的下一條指令的地址入棧,這個入棧動作就產生了“返回地址”空間單元,並把call指令下一條的指令地址也就立即存入了這個“返回地址”空間單元中,這個空間單元的作用是為將來main()呼叫另外的函式譬如:son()使用,也就是說為子函式使用。子函式如何使用呢?當son函式執行完後返回時就要返回到這個“返回地址”空間單元地址處。同樣如果son函式中也有呼叫函式的語句,在反組合語言中也會出現call指令,只要出現call指令就會有它的(指son()的)“返回地址”空間單元的存在)。這樣就可以 根據當前%ebp的值回溯出整個任務的呼叫棧(呼叫過程)。    

在函式棧幀中,一般包含以下幾類重要資訊。 (1)區域性變數:為函式區域性變數開闢的記憶體空間。  (2)棧幀狀態值:儲存前棧幀的頂部和底部(實際上只儲存前棧幀的底部,前棧幀的頂部可以通過棧幀平衡計  算得到),用於在本棧被彈出後恢復出上一個棧幀。  (3)函式返回地址:儲存當前函式呼叫前的“斷點”資訊,也就是函式呼叫前的指令位置,以便在函式返回  時能夠恢復到函式被呼叫前的程式碼區中繼續執行指令。

  注:函式棧幀的大小並不固定,一般與其對應函式的區域性變數多少有關。函式執行過程中,其棧幀大小也是 在不停變化的。  除了與棧相關的暫存器外,我們還需要記住另一個至關重要的暫存器。  EIP:指令暫存器(extended instruction pointer),其記憶體放著一個指標,該指標永遠指向下一條等待  執行的指令地址。  可以說如果控制了EIP暫存器的內容,就控制了程序——我們讓EIP指向哪裡,CPU就會去執行哪裡的指令