概述
我们知道每一次函数的调用都是一个过程,这个过程我们通常称为:函数的调用过程。这个过程要为函数开辟栈空间,用于本次函数的调用过程中临时变量的保存、现场保护。这块栈空间被称为函数栈帧。
在理解函数的栈帧之前,我们需要了解几个特殊的寄存器和一些汇编指令。eip:程序计数器,存放当前指令的下一条指令的地址;ebp:存放指向函数栈帧栈底的地址;esp:存放指向函数栈帧栈顶的地址;call:1将当前指令的下一条指令保存,保存的目的是为了恢复(入栈保存);2跳转至目标函数的地址处;ret:1,将当前栈顶的内容出栈;2,用该内容修改eip。
下面来看这个例子:
#include<stdio.h>;
#include<windows.h>
int my_add(int a, int b)
{
int z = a + b;
return z;
}
int main()
{
int a = 0xAAAAAAAA;
int b = 0xBBBBBBBB;
int ret = my_add(a, b);
printf("%dn", ret);
system("pause");
return 0;
}
当我们要详细研究函数的调用过程,必须的对应汇编代码。
从main函数的地方开始,要展开main函数的调用就得为main函数创建栈帧
接下来是my_add函数的调用
剩下的是函数返回部分
所以说函数的调用就是函数的栈帧的开辟与释放。同时我们也可以看到栈是往下生长的。在函数调用完成后,我们看到并没有对所调用空间内数据的修改,而是这部分空间的内容可以被修改。
最后
以上就是爱笑水杯为你收集整理的深度理解函数的全部内容,希望文章能够帮你解决深度理解函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复