【函数栈帧解析:代码的迷人堆积和无限嵌套】(下)

简介: 【函数栈帧解析:代码的迷人堆积和无限嵌套】

【函数栈帧解析:代码的迷人堆积和无限嵌套】(上):https://developer.aliyun.com/article/1424909


6.word一个字两个字节,dword表示双字四个字节,刚好表示一个整型变量的大小。move将表达式9移入到ecx寄存器中,代表重复的次数,move将表达式CCCCCCCCh移入eax寄存器中,代表数值。rep stos就是重复执行stos指令,stos指令将eax中的值拷贝到ES:EDI指向的地址,所以这串指令就是在main函数中找到9个连续的4字节空间,将其值设置为CCCCCCCCh。



7.局部变量a,b,c开始创建,并进行初始化



8.函数传参过程,传参过程仍然是在main函数,且传参的过程是从右到左,先传y,后传x。



9.call函数调用,1. 压入返回地址 00682297,方便函数调用后返回到main函数栈帧,2. 转入目标Add函数



10.Add函数栈帧形成,这个过程同mian函数栈帧形成的过程相同,唯一的区别是在Add函数中找到3个连续的4字节空间,将其值设置为CCCCCCCCh。



11.变量z创建,并被初始化为0.



12.将地址为ebp+8放到eax寄存器中,然后在将ebp+14h的值与eax寄存器之前存放的值相加放到eax寄存器中,再将eax寄存器的值放到ebp-8处,也就是z变量地址处。



13.将运算的结果放到寄存器中,由于变量z是局部变量,出了函数作用域就会被销毁,为了能顺利带回返回值,利用寄存器不会被销毁的特点,将运算的结果放到eax寄存器。



14.pop数据弹出至指定位置,同时esp栈顶寄存器也要发生改变,Add函数栈帧被释放。



15.ret是恢复返回地址,找到call指令压入的地址,返回到main函数栈帧。



16.局部变量被销毁,变量c接收返回值



17.后面就是main函数的栈帧销毁过程,同Add函数相同



要解决的问题


  • 局部变量是怎么创建的?

在栈帧中,会分配一块内存空间来存储函数的局部变量。这些局部变量是在函数内部定义的,只在函数的生命周期内可见。编译器会根据函数的局部变量声明来确定需要分配多少内存空间。


  • 为什么局部变量的值是随机值?

       局部变量的值可能会被认为是随机的主要是因为在栈帧创建过程中,这些变量并没有经过显式的初始化。当函数栈帧被分配内存并为局部变量分配空间时,这些变量的内容实际上是未定义的,vs编译器会自动为其初始化为0xcccccc。


  • 函数是怎么传参的?传参的顺序是怎么样的?

函数传参的过程,形参的实例化并不在新的函数栈帧内,而是在调用一方函数栈帧内实例化的,当该函数要使用该形参的时候,是通过地址的方法去寻找该形参变量,传参的顺序是从右到左。


  • 形参和实参是什么关系?

       当调用一个函数时,实参的值被传递给函数的形参。这发生在函数的栈帧创建阶段。形参在函数内部被视为局部变量,并且其值被初始化为相应的实参值。但是实参的地址和形参的地址是不同的,所以形参只是实参的一份临时拷贝,修改形参是不能改变实参的。


  • 函数调用是怎么做的?

       函数栈帧通过call指令先1. 压入返回地址 ,也就是调用完函数后要执行的下一条指令,然后call通过jump转入目标函数,待函数使用完,ret指令会找到call指令压入的地址值,通过这个值返回到main函数的栈帧,即调用完函数要执行的下一条指令。


  • 函数调用结束后怎么返回的?

       利用寄存器的值不会随着函数栈帧被销毁而被销毁的特点,利用寄存器将值返回。


相关文章
|
19天前
|
测试技术
函数式编程代码片段(无解析,代码纯享版)
函数式编程代码片段(无解析,代码纯享版)
24 0
|
3天前
|
JSON 监控 网络协议
局域网管理软件的DNS解析代码实践
本文介绍了如何使用Python实现DNS解析,通过示例代码展示了构建和解析DNS请求的过程。此外,还讨论了网络流量监控,利用psutil库获取网络接口的流量数据。最后,探讨了自动将监控数据提交到网站的方法,使用requests库将网络数据以JSON格式发送到指定网站。这些自动化工具提升了局域网管理效率和安全性。
152 1
|
5天前
|
C语言
C语言函数嵌套与递归调用的深入解析
C语言函数嵌套与递归调用的深入解析
13 0
|
5天前
|
存储 程序员 C语言
C语言中的嵌套语句与Switch语句的深入解析
C语言中的嵌套语句与Switch语句的深入解析
13 1
|
14天前
|
机器学习/深度学习 存储 并行计算
深入解析xLSTM:LSTM架构的演进及PyTorch代码实现详解
xLSTM的新闻大家可能前几天都已经看过了,原作者提出更强的xLSTM,可以将LSTM扩展到数十亿参数规模,我们今天就来将其与原始的lstm进行一个详细的对比,然后再使用Pytorch实现一个简单的xLSTM。
31 2
|
19天前
|
机器学习/深度学习 编解码
【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析2
【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析
27 2
|
19天前
|
机器学习/深度学习 计算机视觉
【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析1
【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析
25 1
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
【51单片机】烧写教程:将代码下载到单片机中(图示&解析)
|
19天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
19天前
|
Serverless C++ 容器
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】

推荐镜像

更多