【函数栈帧的创建和销毁】(超详细图解)(中)

简介: 【函数栈帧的创建和销毁】(超详细图解)

在此之前,ebp和esp两个寄存器都在维护_tmainCRTStartup所分配的空间,接下来我们来分析反汇编代码:


1.

002718A0pushebp

push ----------------------压栈的意思,这一步我们将ebp压栈

b507ac2bbf2343dc9e3c571ce3e5085c.gif


2.

002718A1movebp,esp002718A3subesp,0E4h


mov:移动,将esp的值赋给edp

sub:减,将esp的值减去0E4h大小的空间

ce5978be0e794388946c41769f91b08d.png

通过监视我们可以发现,此时esp和ebp的值已经一模一样了,说明ebp已经移到 _tmainCRTSstartup函数的栈顶了,并且esp的值也发生了变化,如图所示:

8a24e306fb854eb7a625474bccdf3075.gif

由此我们可以发现,减去的0E4h的大小原来是为main函数开辟的空间大小,而edp和esp也由维护原来的_tmainCRTSstartup函数的栈帧转变为维护main函数的栈帧了


3.

002718A9pushebx002718AApushesi002718ABpushedi

这里又是压栈了,将ebx,esi,edi从main函数栈顶依次压入:

5eec018955b14c11ac27d3f7d2c98587.png


4.

d6c1e263cbf44c1f909ea647d49dd6ad.png

这里4条汇编指令的意思是将edi向下的39h这么大的空间里全部赋值为cccccccc,如图:

20eaecc217384bacbdfb6f480ccbff10.png


到这里main函数的栈帧就已经创建好了


5.

inta=10;
002718C5movdwordptr [ebp-8],0Ahintb=20;
002718CCmovdwordptr [ebp-14h],14hintc=0;
002718D3movdwordptr [ebp-20h],0c=Add(a, b);

这里是创建a,b,c三个变量,假设我们用一个格子代表4个字节,那么创建的a,b,c三个变量如下图所示:

20eaecc217384bacbdfb6f480ccbff10.pngimage.png

通过查看内存可发现,刚好和我们在main函数栈帧里创建的吻合


6.

002718DAmoveax,dwordptr [ebp-14h]  
002718DDpusheax002718DEmovecx,dwordptr [ebp-8]  
002718E1pushecx

将[ebp-14h]的值传给eax,再进行压栈,将[ebp-8]的值传给ecx,再进行压栈,如图:

20eaecc217384bacbdfb6f480ccbff10.png

大家有没有发现,这一步操作正是我们函数的传参!

目录
相关文章
|
3月前
|
存储 缓存 前端开发
《前端开发者必看:IndexedDB海量数据查询提速秘籍》
IndexedDB 是强大的客户端存储方案,支持大容量数据存储。面对海量数据,优化查询速度至关重要,影响应用性能与用户体验。通过合理使用索引、事务管理、数据分片、缓存策略及定期维护,可有效提升查询效率,保障系统稳定高效运行。
137 4
|
移动开发 小程序 前端开发
Taro 的实现原理是怎么样的?
Taro 的实现原理是怎么样的?
616 0
|
SQL 消息中间件 存储
Flink报错问题之Flink报错:Table sink 'a' doesn't support consuming update and delete changes which is produced by node如何解决
Flink报错通常是指在使用Apache Flink进行实时数据处理时遇到的错误和异常情况;本合集致力于收集Flink运行中的报错信息和解决策略,以便开发者及时排查和修复问题,优化Flink作业的稳定性。
|
应用服务中间件 开发工具 nginx
Mac M1/M2/M3 芯片环境配置以及常用软件安装-前端
Mac M1/M2/M3 芯片环境配置以及常用软件安装-前端 最近换了台新 Mac,所有的配置和软件就重新安装下,顺便写个文章。
1161 1
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之DataWorks发布任务的方法如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
193 0
DataWorks产品使用合集之DataWorks发布任务的方法如何解决
|
SQL 关系型数据库 MySQL
【Mysql】MYSQL参数max_allowed_packet 介绍
【Mysql】MYSQL参数max_allowed_packet 介绍
1376 0
WK
|
机器学习/深度学习 监控 算法
反向传播算法是如何工作的
反向传播算法通过最小化损失函数优化神经网络。首先,输入数据经由前向传播得到预测结果,并计算损失;接着,反向传播计算各参数的梯度,并利用梯度下降法更新权重和偏置。这一过程反复进行,直至满足停止条件。算法具备高效性、灵活性及可扩展性,能处理复杂模式识别与预测任务,适用于不同类型与规模的神经网络,显著提升了模型的预测准确性和泛化能力。
WK
381 3
|
存储 缓存 Apache
Apache Paimon 在蚂蚁的应用
本文整理自 Apache Paimon Committer 闵文俊老师在5月16日 Streaming Lakehouse Meetup · Online 上的分享。Apache Paimon 是一种实时数据湖格式,设计用于流批一体处理,支持实时更新和OLAP查询。它采用LSM Tree结构,提供多种Changelog Producer和Merge Engine,支持高效的数据合并。Paimon适用于流读、批读及时间旅行查询,与多种查询引擎兼容。在蚂蚁集团的应用中,Paimon降低了资源开销,提升了查询性能,简化了研发流程,特别是在去重、核对场景和离线查询加速方面表现突出。
1066 7
Apache Paimon 在蚂蚁的应用
|
机器学习/深度学习 自然语言处理 安全
【网安专题11.8】14Cosco跨语言代码搜索代码: (a) 训练阶段 相关程度的对比学习 对源代码(查询+目标代码)和动态运行信息进行编码 (b) 在线查询嵌入与搜索:不必计算相似性
【网安专题11.8】14Cosco跨语言代码搜索代码: (a) 训练阶段 相关程度的对比学习 对源代码(查询+目标代码)和动态运行信息进行编码 (b) 在线查询嵌入与搜索:不必计算相似性
383 0
|
移动开发 网络协议 算法
TCP中的粘包、拆包问题产生原因及解决方法
TCP中的粘包、拆包问题产生原因及解决方法
1387 0
TCP中的粘包、拆包问题产生原因及解决方法