C语言:函数的调用过程,栈帧的创建和销毁

函数的调用过程(栈桢)

我们以一段简单的代码为例研究一下函数的调用过程:

#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函数又被mainCRTStartup调用的。
我们知道每一次函数调用都是一个过程,这个过程我们通常称为:函数的调用过程。
这个过程要为函数开辟栈空间,用于本次函数的调用中临时变量的保存和现场保护,这块栈空间称之为函数栈桢。

而栈桢的维护我们必须了解ebp和esp两个寄存器,在函数的调用过程中,这两个寄存器存放了维护这个栈的栈底和栈顶指针

比如:
调用main函数,就要为main函数分配栈空间,栈桢维护如下:

esp寄存器:存的是这块调用堆栈相应边界(栈顶)的地址,它用来维护栈顶指针
ebp寄存器:存的是这块调用堆栈栈底的地址,它用来维护栈底指针

当我们要详细研究函数的调用过程时,必须得对应汇编代码来看。

1.从main函数的地方开始,要展开main函数的调用就得为main函数创建栈桢,我们先来看看main函数栈桢的创建。

2.接下来是Add函数的调用。参数传递过程:

3.然后按F11,来到Add函数的内部:

4.最后是函数的返回:

以上就是函数的调用过程。

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/81239622