日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C代码反汇编后的堆栈寄存器EBP和ESP

發(fā)布時間:2024/4/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C代码反汇编后的堆栈寄存器EBP和ESP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在分析一個進程崩潰的嚴(yán)重問題,其中有些過程分析需要對ebp, esp?有清晰的理解,對于ebp?esp?相信大家都很熟悉了,但是為了使本文自成體系,我還是解釋一下。

ebp--棧底指針

esp--棧頂指針

?

?

如圖所示,簡化后的代碼調(diào)用過程如下:

void?Layer02()

{

???????int?b = 2;

}

?

void?Layer01()

{

???????int?a = 1;

?????? Layer02();

}

?

那么函數(shù)執(zhí)行過程中ebpesp是如何變化的呢?如下是反匯編后的代碼:

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)用開始執(zhí)行如下的兩行代碼:

00413700?push??????? ebp?

00413701?mov???????? ebp,esp

?

返回前執(zhí)行如下代碼:

00413728?mov???????? esp,ebp

0041372A?pop???????? ebp?

0041372B?ret

那么這幾行代碼到底是什么意思呢?首先,如圖上所示:

開始兩行代碼的意思是先將ebp1壓棧,然后將現(xiàn)在的棧頂esp1作為函數(shù)調(diào)用時的棧底,所以會執(zhí)行如下語句:

00413701?mov???????? ebp,esp

?

那么,返回前的幾條語句又是什么意思呢?

我想大家已經(jīng)猜到了,當(dāng)函數(shù)調(diào)用執(zhí)行結(jié)束,我們要執(zhí)行相反的過程:

00413728?mov???????? esp,ebp

?

還原棧頂指針

?

0041372A?pop???????? ebp?

?

還原棧底指針

?

0041372B?ret

返回到函數(shù)調(diào)用前的指令繼續(xù)執(zhí)行。待續(xù)

總結(jié)

以上是生活随笔為你收集整理的C代码反汇编后的堆栈寄存器EBP和ESP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。