在c语言中,函数从内存的角度来分析函数的整个调用过程呢!
1、首先了解两个寄存器变量,esp和ebp,他们分别是存放的是栈顶的地址和栈底的地址。
2、要观察函数的调用过程需要从汇编代码开始分析。
#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 = 0;
ret = Add(a,b);
printf("%d\n",ret);
return 0;
}
下图是函数调用的简单草图
首先进入的是tmainCRTStarup函数,这个函数是在调用main函数之前就已经被调用了,
在调用这个函数的时候会自动的分配好栈顶和栈底,并且在栈底和栈顶开辟出来一片内存,并初始化为ccccccccc
接下来就是创建局部变量是a和b,如图中的蓝线所指部分。
遇到函数的调用时,将实参进行拷贝,传到函数的形参里。
这里需要注意的是在对函数进行调用前需要对函数的入口进行保护现场操作,即对函数调用时进行地址存储
接下里就是这里主要的部分-----对函数的调用
在对函数调用时,首先会对内存进行压栈,即将main函数的ebp压到函数调用的内存底端。
再接下来就是开辟一块内存在进行函数的参数的创建,当函数完成调用后,要将所得结果返回,这是内存会进行将数据弹出,
当把esp指向和ebp所指向相同时,系统会弹出ebp的值,这是ebp将会指向,自然按而然的
esp就指向想函数所调用时所存储的地址,这是eax里存储的就是函数计算的结果
再将eax的值赋值给ret,经过输出即可得到数据结果。
到这里函数的调用就结束了