函数栈帧的创建与销毁

本文深入探讨函数栈帧的概念,解析局部变量的创建、未初始化的随机值原因、参数传递机制以及函数调用过程。通过esp和ebp寄存器的使用,阐述了函数栈帧如何维护,并以VS2019为例展示反汇编内容。文章还介绍了函数调用的返回流程,以及Add函数的创建和销毁过程,强调了传参从右向左的规则。
摘要由CSDN通过智能技术生成

函数栈帧的创建与销毁

为什么要了解函数的栈帧?我列举了以下问题,如果掌握了函数栈帧,就能明白这些问题的原因。

1、局部变量是怎么创建的?
2、为什么局部变量不初始化是随机值?
3、函数是怎么传参的?传参的顺序是怎样的?
4、形参和实参是什么关系?
5、函数调用是怎么做的?
6、函数调用是结束后怎么返回的?

首先了解一些寄存器:
eax:累加寄存器
ebx:存放地址
ecx: 计数
edx: 存放余数

接下来重点了解esp与ebp寄存器
esp:栈顶指针
ebp:栈底指针

esp与ebp指针是用来维护函数栈帧的
在每一次函数调用时,都会在栈区开辟相应的空间
用此图来描述
在VS2019下,打开反汇编选项出现以上内容。
(在不同环境下,里面内容略有不同)
在这里插入图片描述
main函数也是被_tmainCRTS函数,mainCRTS函数调用

main函数创建的过程:
push:压栈
lea:加载有效地址
call:调用
sub:减去一个数
dword:word代表两个字节,d代表double合在一起表示四个字节大小
开辟完_taminCRTS与mainCRTS的函数栈帧后,创建了main函数的函数栈帧。此时esp栈顶指针与ebp栈底指针维护此空间。(栈底是高地址)]
之后在main函数中创建变量abc,此时调用Add函数。

Add函数创建
为add函数开辟完栈帧之后,创建变量并进行运算
传参是从右向左进行传参的。
Add函数执行完成便销毁

最后返回main函数的函数栈帧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值