本文是在栈帧层面来深度理解函数的调用过程,那么栈帧具体在内存的那个地方?
下面利用简单的调用求和函数深度理解函数的调用过程
#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 ret = Add(a, b);
printf("ret=%d\n", ret);
return 0;
}
调试程序,查看调用堆栈
main函数在__tmainCRTStartup 函数中调用的,而__tmainCRTStartup函数是在mainCRTStartup函数中被调用的。
每一次函数调用都是一个过程。
这个过程称之为:函数的调用过程
该过程要为函数开辟栈空间,用于本次函数的调用临时变量的保存、现场保护。这块栈空间称之为函数栈帧。
而栈帧的维护有两个寄存器ebp和esp 。这两个寄存器存放了维护这个栈的栈底和栈顶。
了解以上基本概念后,接下来深入了解函数调用的过程。
程序从main函数的地方开始,要展开main函数的调用就得为main函数创建栈帧。
1.main函数栈帧的创建
2.接下来就是Add函数的调用
执行call指令时,按下F11,来到了这里:
再按F11就来到了Add函数的内部:
接下来就到了函数返回部分:
按F10返回到main函数内部:
到这里一个函数完整的调到用到此就结束。
总结
函数的调用过程,能够深入的了解到函数在内存中到底是怎样存储和运行的。有助于我们理解更加复杂的函数,即使我们不知道函数的功能,也能够分析出函数正确的结果。
如有不足之处,欢迎指正!!