浅谈栈帧

小白的文章:

1.什么事栈帧?

这里引用百度的定义:
1.C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。
2.栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。
3.从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里。
由此我们可以知道栈帧就是一个函数调用过程中为其开辟栈空间来在此次调用中来存储参数,变量的,我们称这块空间叫做栈帧。
下面通过一段简单的代码来阐述问题:

#include<stdio.h>
int Add(int x,int y)
{
 int z = 0;
 z = x + y;
 return z;
}
int main()
{
 int a = 10;
 int b = 20;
 int z = 0;
 z = Add(a,b);
 printf("z=%d\n");
 return 0;
}

下面是main函数栈帧的创建的过程:
栈帧

说明:首先将ebp压入栈,将esp赋值给ebp,开辟一个0E4h(vs环境)的空间,产生新的esp,后面就push 三个空间,将新开辟的空间初始化0CCCCCCCCh,在从ebp向后使用创建局部变量a,b。这里忘了把z=0画出来了。
下面是Add函数调用:
add函数调用
说明:首先将形参b中再将a压入,然后进行call指令,指令调用时要先将call下一跳指令的地址压栈,然后再调到add函数。
下面进入Add函数里面:
add函数内部这里写图片描述
说明:这里和main函数栈帧一样都要经过将esp赋值给ebp,在新开辟0CCh大小的空间,压入三个空间为ebx esi edi,初始化剩下的空间,创建变量,将形参相加的结果赋值到z中存在寄存器中,带回返回值。
下面是返回部分:
返回部分
这里写图片描述
说明:返回时esp赋值成ebp,弹出ebp,执行ret指令,将此时的ebp—main弹出并将程序执行到main的ebp处。
下面是整个过程的图示:
整个栈帧的过程
如有错误,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值