调用函数的过程实际上是在栈空间上创建栈桢并释放栈桢的过程。也就是说,我们研究的是栈空间的变化。
以下面代码为例,观察函数调用过程中汇编代码,寄存器等的变化:
#include <stdio.h>
#include <Windows.h>
int Add(int a, int b)
{
return a + b;
}
int main()
{
int a = 0xaaaaaaaa;
int b = 0xbbbbbbbb;
int ret = Add(a, b);
system("pause");
return 0;
}
为了能更好的理解这个过程,先来认识几个寄存器:ebp(基址寄存器,表示栈底),esp(栈顶寄存器,表示栈顶),eip(程序计数器,保存的内容永远是下一条要执行指令的地址)。
接下来定义a,b变量,完成调用Add函数前的准备工作()
创建新的栈桢(Add函数的栈桢)
执行ret后,函数调用完成,回到main函数。
这样,函数完成了一个简单的调用过程。