1、什么是栈帧?

栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。C语言中,每个栈帧对应着一个未运行完的函数。从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架、函数参数、函数的局部变量、函数执行完后返回到哪里等等。栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。

2、Add()函数的调用过程

我们以Add()函数为例深入的研究一下函数的调用过程。
先看一段简单的代码:

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

 1 #include <stdio. h> 2 int Add(int x, int y) 3 { 4 int z = 0; 5 z = x + y; 6 return z; 7 } 8 int main() 9 {10 int a = 10;11 int b = 20;12 int ret = Add(a, b) ;13 printf("ret = %d\n", ret) ;14 return 0;15 }

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

当讲程序调试的时候, 查看【调用堆栈】(按F10进入调试-窗口-调用堆栈,或按快捷键ctrl+alt+C) ,用VS2015调试 如下图:
Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

如果用版本更老的,或其他如VC6.0等编辑器则可以看到更多信息,VS2008调试如图:Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

我们发现其实main函数在 __tmai nCRTStartup 函数中调用的,而 __tmai nCRTStartup 函数是在 mai nCRTStartup

网友评论