ebp是當前函式的訪問指標,即儲存或者讀取數時的指標基位址;esp就是當前函式的棧頂指標。每一次發生函式的呼叫(主函式呼叫子函式)時,在被呼叫函式初始時,都會把當前函式(主函式)的ebp壓棧,以便從子函式返回到主函式時可以獲取ebp。
下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編**
假設執行函式前堆疊指標esp為0xaaaaaaa ;ebp為0xaaaaab0
push p2 ;引數2入棧, esp -= 4h , esp = 0xaaaaaaa - 4h = 0xaaaaaa6
push p1 ;引數1入棧, esp -= 4h , esp = 0xaaaaaaa - 8h = 0xaaaaaa2
call test ;壓入返回位址 esp -= 4h, esp =
0xaaaaaaa
- 0ch =
0xaaaaa9d,注意:這裡是test函式的
返回位址
,即在**段中的位址(偏移)。
;//進入函式內
看完彙編後,再看ebp和esp的定義,哦,豁然開朗,
原來esp
就是一直指向棧頂的指標,而
ebp只是訪問某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。
一般情況下,ebp+x引用函式的引數,ebp-x引用區域性變數
對暫存器ESP和EBP的一些理解
ps ebp是當前函式的訪問指標,即儲存或者讀取數時的指標基位址 esp就是當前函式的棧頂指標。每一次發生函式的呼叫 主函式呼叫子函式 時,在被呼叫函式初始時,都會把當前函式 主函式 的ebp壓棧,以便從子函式返回到主函式時可以獲取ebp。下面是按呼叫約定 stdcall 呼叫函式test int ...
對暫存器ESP和EBP的一些理解
前言 對於經常接觸逆向或者彙編的肯定都對push ebp,mov ebp,esp這兩句印象深刻,由於他們經常出現在過程的開頭,這也是找段首的乙個依據,但是,過程為啥總要以這兩句開頭,這其中又有什麼道理呢?參考自 以下是按呼叫約定 stdcall 呼叫函式test int p1,int p2 的彙編 ...
關於暫存器ESP和EBP的一些理解
一直對暫存器esp和ebp的概念總是有些混淆,檢視定義 esp是棧頂指標,ebp是訪問堆疊指標。還是不能很透徹理解。之後借於一段彙編 總算是對兩者有個比較清晰的理解。下面是按呼叫約定 stdcall 呼叫函式test int p1,int p2 的彙編 假設執行函式前堆疊指標esp為nn push ...