函数栈帧的创建与销毁(上)

简介: 笔记

什么是函数栈帧


我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。

那函数是如何调用的?函数的返回值又是如何待会的?函数参数是如何传递的?这些问题都和函数栈帧

有关系。

函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间

是用来存放:

函数参数和函数返回值

临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)

保存上下文信息(包括在函数调用前后需要保持不变的寄存器)。


什么是栈?


栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函

数,没有局部变量,也就没有我们如今看到的所有的计算机语言。


与函数栈帧有关的汇编语句


eax:通用寄存器,保留临时数据,常用于返回值

ebx:通用寄存器,保留临时数据

ebp:栈底寄存器

esp:栈顶寄存器

eip:指令寄存器,保存当前指令的下一条指令的地址

mov:数据转移指令

push:数据入栈,同时esp栈顶寄存器也要发生改变

pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变

sub:减法命令

add:加法命令

call:函数调用,1. 压入返回地址 2. 转入目标函数

jump:通过修改eip,转入目标函数,进行调用

ret:恢复返回地址,压入eip,类似pop eip命令(返回子程序)

函数如何创建栈帧并销毁

当程序进入main函数时,要给main函数在栈区创建空间,esp(栈顶)和ebp(栈底)对main函数进行维护

4.png


当程序执行时,我们在调试窗口对堆栈段进行调用,我们可以看到main函数是被__tmainSRTStartup函数所调用,说明main函数是它的内部函数,而__tmainSRTStartup又是被mainCRStartup这个函数调用

5.png

梳理一下上面的思路

6.png

这些函数在堆栈当中的存储

7.png

main函数栈帧开辟


接下来重新调试,我们转到反汇编

8.png


调用main函数之前,esp和ebp对调用main函数的函数进行维护 ,当栈顶发生改变时,esp会指向新的栈顶

9.png


003118B0  push        ebp  

003118B1  mov         ebp,esp  

先把ebp入栈,然后把ebp移动到esp的位置


10.png


003118B3  sub         esp,0E4h  

003118B9  push        ebx  

003118BA  push        esi  

003118BB  push        edi  


之后又把esp往上移动,移动完把ebx,esi,edi压栈,esp和ebp现在指的这块空间是为main函数预先开辟好的


11.png12.png13.png


把edi-0EFH也就是main函数开始的这里的地址,放到edi里面去,然后从这个地址开始赋值39次的双字节数据,赋值为CCCC


14.png


到这里main函数栈帧开辟完成


15.png


接下来就是在main函数的空间里,创建三个变量,并给赋值

16.png

相关文章
|
Java 微服务 Spring
@EnableDiscoveryClient注解的作用
@EnableDiscoveryClient注解的作用 @EnableDiscoveryClient 及@EnableEurekaClient 类似,都是将一个微服务注册到Eureka Server(或其他 服务发现组件,例如Zookeeper、Consul等)
1915 0
|
传感器 人工智能 算法
AI概述:阿里文娱智能算法的新应用
阿里巴巴文娱-智能算法的新应用方向
AI概述:阿里文娱智能算法的新应用
|
Android开发 iOS开发 开发者
没有 iOS 开发者账号的情况下部署到真机的方法
原文发表于我的技术博客 本文分享了官方推荐的没有 iOS 开发者账号的情况下部署到真机的方法,供参考。原文发表于我的技术博客 1. 官方推荐的方法 原文在此,也就是 Ionic 官方团队在博客中分享的方法,我简单翻译些重要的信息,详细细节可以参考原文。
1627 0
|
机器学习/深度学习 传感器 编解码
翻译:Multi-scale Multi-path Multi-model Fusion Nerwork
M3Net: 多尺度多路径多模型融合网络及其在 RGB-D 显着目标检测中的应用实例
381 0
|
存储 SQL 监控
16PostgreSQL 本地分区表的用法和优化|学习笔记
快速学习16PostgreSQL 本地分区表的用法和优化
1076 0
16PostgreSQL 本地分区表的用法和优化|学习笔记
|
Oracle Java 关系型数据库
只需四步完成java JDK1.8的下载安装与配置【图文详解】(一)
只需四步完成java JDK1.8的下载安装与配置【图文详解】(一)
558 0
只需四步完成java JDK1.8的下载安装与配置【图文详解】(一)
|
编解码 物联网 5G
5G 承载网络概述 | 带你读《5G承载关键技术与规划设计》之一
5G 承载网络是为 5G 无线接入网和核心网提供网络连接的基础网络,不仅要为这些网络连接提供灵活调度、组网保护和管理控制等功能,还要提供带宽、时延、同步和可靠性等方面的性能保障。本节首先概述 5G 网络的三大应用场景以及 5G相对于 4G 在关键能力指标上的变化;接着分析 5G RAN 架构演进,介绍核心网重构对承载网的挑战。
5G 承载网络概述   | 带你读《5G承载关键技术与规划设计》之一
|
存储 分布式计算 搜索推荐
闲鱼触达系统背后——我想更懂你
上周看完《闲鱼如何通过Push升级,更懂你?》,大家是不是一直等着下篇呢?Hermes 咋就这么敏捷呢?她咋就这么懂你呢?今天,小橙子就带领大家一起揭开她神秘的面纱。触达类业务,对用户最重要的三个问题:
2399 0
闲鱼触达系统背后——我想更懂你
|
Shell 持续交付 开发工具
Fastlane-Android(持续集成+渠道分发)
fastlane对Android平台支持实在有限,15个核心工具中仅有2个是用于Android平台的,其中: 1.Supply是用于上传APK文件和同步Meta信息到Google Play商店(类似iOS的Deliver) 2.Screengrab是用于生成各种屏幕尺寸的截屏,然后上传这些截屏到Google Play商店 以上都是我粘贴的。
6971 0
|
Python 数据格式 监控
日志服务数据加工 - DSL语言介绍
本文介绍日志服务数据加工 - DSL语言规范
5812 0