詳解C++代碼反匯編后的堆棧寄存器EBP和ESP
最近在分析一個進程崩潰的嚴重問題,其中有些過程分析需要對ebp, esp 有清晰的理解,對於ebp 和esp 相信大家都很熟悉了,但是為了使本文自成體系,我還是解釋一下。
ebp--棧底指針
esp--棧頂指針

如圖所示,簡化后的代碼調用過程如下:
void Layer02()
{
int b = 2;
}
void Layer01()
{
int a = 1;
Layer02();
}
那么函數執行過程中ebp和esp是如何變化的呢?如下是反匯編后的代碼:
void Layer02()
{
00413700 push ebp
00413701 mov ebp,esp
00413703 sub esp,0CCh
00413709 push ebx
0041370A push esi
0041370B push edi
0041370C lea edi,[ebp-0CCh]
00413712 mov ecx,33h
00413717 mov eax,0CCCCCCCCh
0041371C rep stos dword ptr es:[edi]
int b = 2;
0041371E mov dword ptr [b],2
}
00413725 pop edi
00413726 pop esi
00413727 pop ebx
00413728 mov esp,ebp
0041372A pop ebp
0041372B ret
我們看到函數調用開始執行如下的兩行代碼:
00413700 push ebp
00413701 mov ebp,esp
返回前執行如下代碼:
00413728 mov esp,ebp
0041372A pop ebp
0041372B ret
那么這幾行代碼到底是什么意思呢?首先,如圖上所示:
開始兩行代碼的意思是先將ebp1壓棧,然后將現在的棧頂esp1作為函數調用時的棧底,所以會執行如下語句:
00413701 mov ebp,esp
那么,返回前的幾條語句又是什么意思呢?
我想大家已經猜到了,當函數調用執行結束,我們要執行相反的過程:
00413728 mov esp,ebp
還原棧頂指針
0041372A pop ebp
還原棧底指針
0041372B ret
返回到函數調用前的指令繼續執行。待續…
