详解C++代码反汇编后的堆栈寄存器EBP和ESP
最近在分析一個(gè)進(jìn)程崩潰的嚴(yán)重問(wèn)題,其中有些過(guò)程分析需要對(duì)ebp, esp?有清晰的理解,對(duì)于ebp?和esp?相信大家都很熟悉了,但是為了使本文自成體系,我還是解釋一下。
ebp--棧底指針
esp--棧頂指針
?
?
如圖所示,簡(jiǎn)化后的代碼調(diào)用過(guò)程如下:
void?Layer02()
{
???????int?b = 2;
}
?
void?Layer01()
{
???????int?a = 1;
?????? Layer02();
}
?
那么函數(shù)執(zhí)行過(guò)程中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
我們看到函數(shù)調(diào)用開(kāi)始執(zhí)行如下的兩行代碼:
00413700?push??????? ebp?
00413701?mov???????? ebp,esp
?
返回前執(zhí)行如下代碼:
00413728?mov???????? esp,ebp
0041372A?pop???????? ebp?
0041372B?ret
那么這幾行代碼到底是什么意思呢?首先,如圖上所示:
開(kāi)始兩行代碼的意思是先將ebp1壓棧,然后將現(xiàn)在的棧頂esp1作為函數(shù)調(diào)用時(shí)的棧底,所以會(huì)執(zhí)行如下語(yǔ)句:
00413701?mov???????? ebp,esp
?
那么,返回前的幾條語(yǔ)句又是什么意思呢?
我想大家已經(jīng)猜到了,當(dāng)函數(shù)調(diào)用執(zhí)行結(jié)束,我們要執(zhí)行相反的過(guò)程:
00413728?mov???????? esp,ebp
?
還原棧頂指針
?
0041372A?pop???????? ebp?
?
還原棧底指針
?
0041372B?ret
返回到函數(shù)調(diào)用前的指令繼續(xù)執(zhí)行。待續(xù)…
總結(jié)
以上是生活随笔為你收集整理的详解C++代码反汇编后的堆栈寄存器EBP和ESP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: StackOverflow程序员推荐:每
- 下一篇: All is about C!