詳細解析ESP暫存器與EBP暫存器

2021-06-20 16:23:52 字數 2274 閱讀 8007

詳細解析esp

暫存器與

ebp暫存器

最近在看彙編碼,

經常在程式的開頭看到

esp和

ebp暫存器的出現

,由於本人基礎知識的不牢靠

,便上網查閱相關的資料

,可惜網上的資料都不給力

,都只是流於形式

,沒有好好的解釋這兩個東西是什麼

.終於通過

google

國外的**

,得到乙個相當不錯的網頁

,上面解釋的很清晰

英文好的可以上去看看

(我好像很喜歡這句話)

(1)esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。

(2)ebp:基址指標暫存器(extended base pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。

在這裡要注意由於在intel系統中棧是向下生長的(棧越擴大其值越小,堆恰好相反)

(1)esp:棧指標暫存器(extended stack pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的棧頂。

(2)ebp:基址指標暫存器(extended base pointer),其內存放著乙個指標,該指標永遠指向系統棧最上面乙個棧幀的底部。

根據上述的定義

,在通常情況下esp是可變的,隨著棧的生產而逐漸變小,而esb暫存器是固定的,只有當函式的呼叫後,發生入棧操作而改變。

在上述的定義中使用esp來標記棧的底部,他隨著棧的變化而變化

pop ebp;出棧 棧擴大4byte 因為ebp為32位

push ebp;出棧,棧減少4byte

add esp, 0ch;表示棧減小12byte

sub esp, 0ch;表示棧擴大12byte

而ebp暫存器的出現則是為了另乙個目標,通過固定的位址與偏移量來尋找在棧引數與變數。而這個固定值者存放在ebp暫存器中,。但是這個值會在函式的呼叫過程發生改變。而在函式執行結束之後需要還原,因此,在函式的出棧入棧過程中進行儲存。

下面根據彙編碼來對上面的內容進行解釋

現在利用vs2013

的反彙編功能進行解釋注意設定好斷點

在上述的彙編碼中我們可以看到在函式開始的時候,習慣上以這麼兩端**開始

push     ebp  

mov     ebp,esp 

按照字面上理解,上面兩句話的意思是將ebp

推入棧中,之後讓

ebp等於

esp

為什麼這麼做呢?因為ebp

作為乙個用於定址的固定值是有時間週期的。只有在某個函式執行過程中才是固定的,在函式呼叫與函式執行完畢後會發生改變。

在函式呼叫之前,將呼叫者的函式(caller

)的ebp

存入棧,以便於在執行完畢後恢復現場是還原

ebp的值。下一步,

foo必須為它的區域性變數分配空間,同時,也必須為它可能用到的一些臨時變數分配空間。

sub esp, 0cch;減去的值根據程式而定

之後會根據情況看是否儲存某些特定的暫存器(ebx

,esi

和edi)

之後ebp

的值會保持固定。此後區域性變數和臨時儲存都可以通過基準指標

ebp加偏移量找到了

在函式執行完畢,控制流返回到呼叫者的函式(caller

)之前會進行下述操作

pop         edi

pop         esi

pop         ebx

mov         esp,ebp   

pop         ebp         

ret所謂有始有終,這是會還原上面儲存的暫存器值,之後還原esp

的值(上乙個函式呼叫之前的

esp被儲存在固定的

ebp中)與

ebp值。這一過程被稱為還原現場之後通過

ret返回上乙個函式。

esp暫存器與ebp暫存器介紹

esp extended stack pointer 是指標暫存器的一種 另一種為ebp 用於堆疊指標。esp為棧指標,用於指向棧的棧頂 下乙個壓入棧的活動記錄的頂部 而ebp為幀指標,指向當前活動記錄的頂部。棧指標與幀指標標識出了當前活動記錄的位置。當函式被呼叫的時候,執行如下操作 將幀指標壓入棧...

對暫存器ESP和EBP的一些理解

ps ebp是當前函式的訪問指標,即儲存或者讀取數時的指標基位址 esp就是當前函式的棧頂指標。每一次發生函式的呼叫 主函式呼叫子函式 時,在被呼叫函式初始時,都會把當前函式 主函式 的ebp壓棧,以便從子函式返回到主函式時可以獲取ebp。下面是按呼叫約定 stdcall 呼叫函式test int ...

對暫存器ESP和EBP的一些理解

ebp是當前函式的訪問指標,即儲存或者讀取數時的指標基位址 esp就是當前函式的棧頂指標。每一次發生函式的呼叫 主函式呼叫子函式 時,在被呼叫函式初始時,都會把當前函式 主函式 的ebp壓棧,以便從子函式返回到主函式時可以獲取ebp。下面是按呼叫約定 stdcall 呼叫函式test int p1,...