通過一段彙編,加深對暫存器ESP和EBP的理解

劍西樓發表於2017-02-08
一直對暫存器ESP和EBP的概念總是有些混淆,檢視定義ESP是棧頂指標,EBP是存取堆疊指標。還是不能很透徹理解。之後借於一段彙編程式碼,總算是對兩者有個比較清晰的理解。
下面是按呼叫約定__stdcall 呼叫函式test(int p1,int p2)的彙編程式碼
;假設執行函式前堆疊指標ESP為NN
push   p2    ;引數2入棧, ESP -= 4h , ESP = NN - 4h
push   p1    ;引數1入棧, ESP -= 4h , ESP = NN - 8h
call test    ;壓入返回地址 ESP -= 4h, ESP = NN - 0Ch  
;//進入函式內
{
push   ebp                        ;保護先前EBP指標, EBP入棧, ESP-=4h, ESP = NN - 10h
mov    ebp, esp                   ;設定EBP指標指向棧頂 NN-10h
mov    eax, dword ptr  [ebp+0ch]  ;ebp+0ch為NN-4h,即引數2的位置
mov    ebx, dword ptr  [ebp+08h]  ;ebp+08h為NN-8h,即引數1的位置
sub    esp, 8                     ;區域性變數所佔空間ESP-=8, ESP = NN-18h
...
add    esp, 8                     ;釋放區域性變數, ESP+=8, ESP = NN-10h
pop    ebp                        ;出棧,恢復EBP, ESP+=4, ESP = NN-0Ch
ret    8                          ;ret返回,彈出返回地址,ESP+=4, ESP=NN-08h, 後面加運算元8為平衡堆疊,ESP+=8,ESP=NN, 恢復進入函式前的堆疊.
}
看完彙編後,再看EBP和ESP的定義,哦,豁然開朗,
原來ESP就是一直指向棧頂的指標,而EBP只是存取某時刻的棧頂指標,以方便對棧的操作,如獲取函式引數、區域性變數等。

相關文章