天天看点

栈帧 - 理解C函数调用过程

每天进步一点点。

在c程序中当计算机遇到某一个函数时,它就会跳转过去执行这个函数,执行完毕后接着再去执行下一条函数(指令)。在执行调用函数的过程中,计算机通常还要根据函数完成一些工作,比如数据的传递(形参拷贝、返回值)、内存的分配和释放、执行控制的转移,这些操作通过形成一个栈帧来完成。

栈帧是什么? 栈帧(stack  frame):简单来讲,栈帧就是函数运行的环境。每个函数在被调用时都会在栈区形成一个叫栈帧的结构,这个结构中保存了 函数参数、函数的局部变量 、函数执行完后返回到哪里等等一些数据 , 如图:

栈帧 - 理解C函数调用过程

栈帧的形成通过栈指针esp和帧指针ebp的移动及相关操作来完成。 在介绍具体调用过程之前先对相关的几个名词作一解释。 1、ebp:栈底指针,即指向栈帧底部的指针。 2、esp:栈顶指针,栈帧指针只有一对。 3、call:用于保存当前指令的下一条指令并跳转到目标函数。 3、push:入栈(push   寄存器    保护数据)。 4、pop:出栈。 5、ptr:相当于指针,详解: 汇编语言中的ptr(很全) 6、mov:类似于赋值操作。 7、add:加法操作。 8、sub:减法操作。

让我们通过下面这段代码来看一看栈帧具体是如何形成并完成相关功能的。

#include <stdio.h>
#include <windows.h>

int fun( int x, int y)
{
	int c = 8;

	return c;
}

int main()
{
	int a = 2;
	int b = 4;

	int ret = fun(a, b);

	printf("you should run here!\n");

	system("pause");
	return 0;
}
           

下面是main函数调用fun函数之前进行的一些操作,包括这些: 1、参数拷贝(参数实例化)。 2、保存当前指令的下一条指令,并跳转到被调函数。 这些操作均在main中进行。

栈帧 - 理解C函数调用过程

接下来是调用fun函数并执行的一些操作,包括: 1、移动ebp、esp形成新的栈帧结构。 2、压栈(push)形成临时变量并执行相关操作。 3、return一个值。 这些操作在fun中进行。

栈帧 - 理解C函数调用过程

被调函数完成相关操作后需返回到原函数中执行下一条指令,操作如下: 1、出栈(pop)。 2、回复main函数的栈帧结构。(pop ) 3、返回main函数 这些操作也在fun中进行。

栈帧 - 理解C函数调用过程

至此,在main中调用fun的整个过程已经完成。

成于坚持,败于止步!

【作者:果冻  http://blog.csdn.net/jelly_9】

继续阅读