程序员的内功——函数栈帧的创建和销毁

我们在每一次使用自定义函数的时候,有没有想过为什么这个形参为什么不能改变main函数中的参数。

不要和我杠(不同的编辑器调用过程中是有差异的)

我们开始今天的正题。

首先我们要介绍二个寄存器ebp(栈底指针),esp(栈顶指针)这二个寄存器存放的是地址,而这个地址是用来维护函数栈帧的。

首先

我们写这样一个函数。我们转到反汇编。就可以看到

1.这个push就是压栈,在内存中申请一个地方,这里放的就是ebp,2.然后就是把ebp的值赋给esp,这样ebp和esp指向的就是同一个地址。3.sub就是减,把esp的地址减0E4h(而这之间就有很大一块空间)。456.就是在esp上面(计算机是从高到低地址,我们把下面看为高地址)压三个寄存器(有什么用呢,我也不知道。但是这几个寄存器对于现在的我,不了解没影响。)78910.就是把从edi到eax全部初始化为0cccccch。然后在创建变量。

后面再调用函数,1.计算机把ebp-14h(a)赋值给eax,再把eax压到上面。2.b同理。3.call语句,

这个就是call的值这个是不是call下一条指令的地址。

然后和前面一样创建。

我们来说返回当你要返回的时候,他会把值放在eax中,因为eax是寄存器所以add函数销毁不会销毁eax,他可以正常返回。并且从开始压call地址的位置找到call下一条指令的地址。从而开始执行下一条指令。

自己理解不高,望包涵

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值