首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器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;
}
当程序调试的时候,打开 调用堆栈 ,如下图:
可以发现
main()
函数是在
__tmainCRTStartup()
函数中调用的,而
__tmainCRTStartup()
函数是在
mainCRTStartup()
函数中调用的。
要想研究函数的调用过程,就得在汇编代码里进行。
1.main()
函数栈帧的创建
2.Add()
函数栈帧
3.返回main()
函数
以上就是函数调用的整个过程。