【函数栈帧的创建和销毁】(超详细图解)(中)

简介: 【函数栈帧的创建和销毁】(超详细图解)

在此之前,ebp和esp两个寄存器都在维护_tmainCRTStartup所分配的空间,接下来我们来分析反汇编代码:


1.

002718A0pushebp

push ----------------------压栈的意思,这一步我们将ebp压栈

b507ac2bbf2343dc9e3c571ce3e5085c.gif


2.

002718A1movebp,esp002718A3subesp,0E4h


mov:移动,将esp的值赋给edp

sub:减,将esp的值减去0E4h大小的空间

ce5978be0e794388946c41769f91b08d.png

通过监视我们可以发现,此时esp和ebp的值已经一模一样了,说明ebp已经移到 _tmainCRTSstartup函数的栈顶了,并且esp的值也发生了变化,如图所示:

8a24e306fb854eb7a625474bccdf3075.gif

由此我们可以发现,减去的0E4h的大小原来是为main函数开辟的空间大小,而edp和esp也由维护原来的_tmainCRTSstartup函数的栈帧转变为维护main函数的栈帧了


3.

002718A9pushebx002718AApushesi002718ABpushedi

这里又是压栈了,将ebx,esi,edi从main函数栈顶依次压入:

5eec018955b14c11ac27d3f7d2c98587.png


4.

d6c1e263cbf44c1f909ea647d49dd6ad.png

这里4条汇编指令的意思是将edi向下的39h这么大的空间里全部赋值为cccccccc,如图:

20eaecc217384bacbdfb6f480ccbff10.png


到这里main函数的栈帧就已经创建好了


5.

inta=10;
002718C5movdwordptr [ebp-8],0Ahintb=20;
002718CCmovdwordptr [ebp-14h],14hintc=0;
002718D3movdwordptr [ebp-20h],0c=Add(a, b);

这里是创建a,b,c三个变量,假设我们用一个格子代表4个字节,那么创建的a,b,c三个变量如下图所示:

20eaecc217384bacbdfb6f480ccbff10.pngimage.png

通过查看内存可发现,刚好和我们在main函数栈帧里创建的吻合


6.

002718DAmoveax,dwordptr [ebp-14h]  
002718DDpusheax002718DEmovecx,dwordptr [ebp-8]  
002718E1pushecx

将[ebp-14h]的值传给eax,再进行压栈,将[ebp-8]的值传给ecx,再进行压栈,如图:

20eaecc217384bacbdfb6f480ccbff10.png

大家有没有发现,这一步操作正是我们函数的传参!

目录
相关文章
|
6月前
|
存储 安全 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-2
|
6月前
|
存储 编译器 C语言
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
深度剖析c语言程序 -- 函数栈帧的创建和销毁(纯肝货)-1
|
程序员 编译器 C语言
细谈函数栈帧的创建与销毁
我们在写C语言代码时,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。那函数如何调用?函数的返回值如何返回的?函数参数是如何传递的?这些问题都与函数栈帧有关系。
177 0
|
6月前
|
存储 编译器
初识函数栈帧的创建与销毁(笔记)
初识函数栈帧的创建与销毁(笔记)
|
存储 C语言 C++
你知道函数栈帧的创建和销毁吗?
你知道函数栈帧的创建和销毁吗?
73 0
|
编译器 C语言
【函数栈帧的创建和销毁】(超详细图解)(上)
【函数栈帧的创建和销毁】(超详细图解)
98 0
【函数栈帧的创建和销毁】(超详细图解)(上)
|
编译器 C语言 C++
C语言之函数栈帧的创建与销毁讲解(1)(二)
C语言之函数栈帧的创建与销毁讲解(1)
|
编译器 C语言
C语言之函数栈帧的创建与销毁讲解(1)(一)
C语言之函数栈帧的创建与销毁讲解(1)