在C语言中函数是如何调用的?我们通过下方这个简单的代码来进行深入研究。
#include <stdio.h>
#include <stdlib.h>
int Add(int x, int y)
{
int i = 0;
i = x + y;
return i;
}
int main()
{
int a = 10;
int b = 20;
int c = 0;
c = Add(a, b);
printf("%d\n", c);
system("pause");
return 0;
}
每一次函数调用都是一个过程,这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存,现场保护。我们称这块栈空间为函数栈帧。
为了维护栈帧,在函数调用的过程中esp寄存器存放了维护这个栈的栈顶指针,ebp寄存器存放了维护这个栈的栈底指针。
而我们知道main函数是在__tmainCRTStarup函数中调用的,而__tmainCRTStarup函数是在mainCRTStarup被调用的。
当我们要详细研究函数的调用过程,我们需要研究其对应的汇编代码。
具体过程分为以下四步: