小白的文章:
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函数调用:
说明:首先将形参b中再将a压入,然后进行call指令,指令调用时要先将call下一跳指令的地址压栈,然后再调到add函数。
下面进入Add函数里面:
说明:这里和main函数栈帧一样都要经过将esp赋值给ebp,在新开辟0CCh大小的空间,压入三个空间为ebx esi edi,初始化剩下的空间,创建变量,将形参相加的结果赋值到z中存在寄存器中,带回返回值。
下面是返回部分:
说明:返回时esp赋值成ebp,弹出ebp,执行ret指令,将此时的ebp—main弹出并将程序执行到main的ebp处。
下面是整个过程的图示:
如有错误,欢迎指出。