函数的调用过程(栈帧)
我们深入地研究一下函数的调用过程。
先看一段简单的代码:
#include <stdio.h>
int Add(int a, int b)
{
int z = 0;
z = a + b;
return z;
}
int main()
{
int a = 10;
int b = 20;
int ret = 0;
ret = Add(a, b);
printf("ret = %d\n",ret);
return 0;
}
进行程序调试的时候,查看调用堆栈,如下图:
我们发现main函数在mainCRTStartup函数中调用的。
我们知道函数调用过程要为自己开辟一块空间,这块空间我们称之为栈空间,而这个栈空间我们称之为函数栈帧。
在函数调用的过程中我们用ebp和esp两个寄存器来维护这个栈的栈底和栈顶指针。
如下图:
当我们要详细研究函数的调用过程,必须对应汇编代码。
结果如下图:
然后执行main函数里的代码:转到反汇编
结果如下图:
接下来是Add 函数的调用。参数传递过程:
执行call的时候按F11,来到了这里
再按F11就进入Add函数的执行代码处
剩下的是函数 返回部分:
ret指令后,跳到了这里
接下来通过printf函数打印
注
我们这里是用VC6.0来演示的,栈帧这部分内容在不同编译器上实现存在差异,但是思想都是一致的