计算机在执行调用函数的过程中,会根据函数完成一些工作,比如数据的传递(形参拷贝、返回值)、内存的分配和释放、执行控制和转移,这些操作需要通过形成一个栈帧来完成。
栈帧(stack frame):栈帧就是函数运行的环境。每个函数在被调用的时候都会在栈区形成一个叫做栈帧的结构,这个结构保存了函数参数、局部变量、函数执行完后返回到哪里等一些数据
汇编相关名词解释:
1.ebp:栈底指针,esp:栈顶指针,栈帧指针只有一对
2.call:用于保存当前指令的下一条指令并跳转到目标函数
3.push:入栈,pop:出栈
4.ptr:相当于指针
5.mov:类似于赋值操作
3.add:加法操作,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函数中进行。
接下来是调用fun函数并执行的一些操作:
1.移动ebp、esp形成的新的栈帧结构。
2.push压栈形成临时变量并执行相关操作。
3.return一个值。
这些都是在fun中进行。
被调函数完成操作后返回到原函数中执行下一条指令:
1.出栈(pop)。
2.回复main函数的帧栈结构
3.返回main函数
这些操作也在fun中进行
至此,在main中调用fun的整个过程已经完成。
原博客:http://blog.csdn.net/jelly_9/article/details/53239718