栈帧

下面在VC6.0下通过一段代码来说明栈帧的概念及相关知识,代码如下:

#include<stdio.h>
int fun(int x,int y)
{
int z=x+y;
return z;
}
int main()
{
int a=0xAAAAAAAA;
int b=0xBBBBBBBB;
int c=fun(a,b);
printf("you should run here\n");
printf("%d\n",c);
return 0;
}

1.首先要说明几点。

(1)程序跑起来,第一个被调用的函数不是main函数,而是mainCRTStartup函数,可以按F10进行调试—点击查看—调试窗口—Call Stack,结果如下:

栈帧

(2)CPU通过CPU中的EIP寄存器知道具体执行什么指令。

(3)当CPU正在执行PC(即寄存器EIP)所给的指令时,PC去指向下一条要执行的指令。

(4)调用函数时要跳转到该函数处。

(5)每一次函数调用都是一个过程,这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存,这个栈空间称为栈帧。

(6)每一个函数都有一个栈帧。

(7)栈是向下生长的,即向低地址处生长。

2.画图说明创建栈帧以及释放栈帧、临时变量的过程。

栈帧

3.对于所画的栈帧图,通过调试分析该过程。

(1)call指令的功能。

栈帧

栈帧

(2)ret指令的功能。

栈帧

栈帧