函数栈帧的创建和销毁

本文介绍了在VS2013环境下,通过反汇编查看函数栈帧的创建和销毁。文章详细解释了ebp和esp寄存器在维护栈帧中的作用,以及push和pop操作如何影响栈。通过示例展示了如何为函数开辟栈空间,初始化局部变量,并在函数调用后如何恢复栈的状态。
摘要由CSDN通过智能技术生成

 函数栈帧的创建和销毁

环境为vs2013,编译器越高级,越不容易学习和观察。在不同的编译器下函数栈帧的创建和销毁略有差异,大体逻辑是相同的。

1.寄存器 eax、ebx、ecx、edx..

今天介绍ebp和esp,这两个寄存器中存放的是地址,这两个地址是用来维护栈帧的。正在调用哪个函数,ebp和esp就维护哪一块空间。

每一个函数调用,都要在栈区创建一个空间。

F10-右键-反汇编-可以查看C语言对应的汇编代码

push压栈 从栈顶上放一个元素进去  - pop出栈:从栈顶删除一个元素

Mov 把esp的值给ebp

Sub 给esp减去0E4h,地址变小,指向上面的某一块区域

出现了为main函数开辟的空间(栈帧)

Push 三次 ebx esi edi

Push 一次 esp往上走

Lea load effecitive address加载有效地址 ebp-0E4h放在edi里面

mov把39h放在ecx里面。再mov把0CCCCCCCh放在eax里面

Rep stos把从edi开始的ecx也就是39h次dword(double word,一个word两个字节)全部改成eax的内容也就是0CCCCCCCCh。

开始执行语句块了

把0Ah(也就是10)放在ebp-8的位置,如果不初始化,打印出来随机值“烫烫烫烫”其实就是类似于CCCC的东西的作用。

倒着放00 00 00 0a

把ebp-14h的值(20)放到eax里面

压栈eax esp上移

call调用函数

压了地址进去

add函数

形参是实参的临时拷贝,函数调用

把z 放在eax寄存器里面保存

Pop esp往下走 mov把ebp赋给esp

ebp回去了,回到main底部

Add 把形参也释放

和放到c里面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值