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

2022-05-08 08:24:10 字數 1531 閱讀 9867

前言:對於經常接觸逆向或者彙編的肯定都對push ebp,mov    ebp, esp這兩句印象深刻,由於他們經常出現在過程的開頭,這也是找段首的乙個依據,但是,過程為啥總要以這兩句開頭,這其中又有什麼道理呢?

參考自:

以下是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編**

push   p2    ;引數2入棧, esp -= 4h , esp = 0xaaaaaa6

0xaaaaaaa - 8h =    call test    ;壓入返回位址 esp -= 4h, esp = 0xaaaaa9d,注意:這裡是test函式的。即在**段中的位址(偏移)。

;//進入函式內

push   ebp                           ;保護先前ebp指標, ebp入棧(即0xaaaaab0入棧。注意與返回位址差別), esp-=4h, esp = 0xaaaaa99

0xaaaaa99

;ebp+0ch為mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h為sub    esp, 8                     ;區域性變數所佔空間esp-=8, esp = 0xaaaaa91

add    esp, 8                     ;釋放區域性變數, esp+=8, esp = 0xaaaaa99

即把棧中位址0xaaaaa9d的內容pop到ebp中

0xaaaaaa2, 後面加運算元8為平衡堆疊,esp+=8,esp=}

原來esp就是一直指向棧頂的指標,而ebp僅僅是訪問某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。

以下是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編**

push   p2    ;引數2入棧, esp -= 4h , esp = 0xaaaaaa6

0xaaaaaaa - 8h =    call test    ;壓入返回位址 esp -= 4h, esp = 0xaaaaa9d,注意:這裡是test函式的。即在**段中的位址(偏移)。

;//進入函式內

push   ebp                           ;保護先前ebp指標, ebp入棧(即0xaaaaab0入棧。注意與返回位址差別), esp-=4h, esp = 0xaaaaa99

0xaaaaa99

;ebp+0ch為mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h為sub    esp, 8                     ;區域性變數所佔空間esp-=8, esp = 0xaaaaa91

add    esp, 8                     ;釋放區域性變數, esp+=8, esp = 0xaaaaa99

即把棧中位址0xaaaaa9d的內容pop到ebp中

0xaaaaaa2, 後面加運算元8為平衡堆疊,esp+=8,esp=}

原來esp就是一直指向棧頂的指標,而ebp僅僅是訪問某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。

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

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

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

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

關於暫存器ESP和EBP的一些理解

一直對暫存器esp和ebp的概念總是有些混淆,檢視定義 esp是棧頂指標,ebp是訪問堆疊指標。還是不能很透徹理解。之後借於一段彙編 總算是對兩者有個比較清晰的理解。下面是按呼叫約定 stdcall 呼叫函式test int p1,int p2 的彙編 假設執行函式前堆疊指標esp為nn push ...