今天写一下函数的调用过程。先看一个简单的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.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);
system("pause");
return 0;
}
我们发现其实每一次main函数都是在_tmainCRTStartup函数中调用的,而_tmainCRTStartup函数又是在mainC RTStartup函数被调用的。每一次函数的调用都是一个过程,称为函数调用过程。
这个过程要为函数开辟栈空间,用于本次函数调用过程中的临时变量的保存、现场保护。这块栈空间我们称之为函数栈帧。
而在栈帧的维护中,我们用ebp和esp两个寄存器存放函数调用过程中的栈顶指针的栈底指针。
esp存放了指向函数栈帧栈顶的地址。
ebp存放了指向函数栈帧栈底的地址。
下图是具体的调用过程:
注:栈帧在不同编译器上实现存在差异,但是基本思想是一致的