首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。
通过一个栗子来研究一下函数的调用过程
#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 c = 0;
c = Add(a, b);
printf("c = %d\n",c);
return 0;
}
当程序调试的时候,打开 调用堆栈 ,如下图:
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/9caf5efbe82874a92756e6f66053ada9.png)
可以发现
main()
函数是在
__tmainCRTStartup()
函数中调用的,而
__tmainCRTStartup()
函数是在
mainCRTStartup()
函数中调用的。
要想研究函数的调用过程,就得在汇编代码里进行。
1.main()
函数栈帧的创建
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/aefef44fa1315f52efd09c14e18f51ce.png)
2.Add()
函数栈帧
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/2d736f3874ca16b88104f41872070508.png)
3.返回main()
函数
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/d598284630f76e51a19961d04f6d1535.png)
以上就是函数调用的整个过程。