深度理解函数

  我们知道每一次函数的调用都是一个过程,这个过程我们通常称为:函数的调用过程。这个过程要为函数开辟栈空间,用于本次函数的调用过程中临时变量的保存、现场保护。这块栈空间被称为函数栈帧。
      在理解函数的栈帧之前,我们需要了解几个特殊的寄存器和一些汇编指令。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("%d\n", ret);
	system("pause");
	return 0;
}
当我们要详细研究函数的调用过程,必须的对应汇编代码。
从main函数的地方开始,要展开main函数的调用就得为main函数创建栈帧

接下来是my_add函数的调用
剩下的是函数返回部分

所以说函数的调用就是函数的栈帧的开辟与释放。同时我们也可以看到栈是往下生长的。在函数调用完成后,我们看到并没有对所调用空间内数据的修改,而是这部分空间的内容可以被修改。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值