编程基础:函数栈帧的创建和销毁

news2024/11/16 4:34:25

函数栈帧的创建和销毁

  • 一、什么是函数栈帧
  • 二、常见的寄存器
  • 三、函数指令
  • 三、函数栈帧的创建和销毁
    • (一)普通值传递
      • 1、开始执行函数
      • 2、main函数的函数栈帧的开辟
        • (1)main 栈帧空间的开辟和默认初始化
        • (2)main 局部变量的初始化
        • (3)函数传参和 swap 函数的调用
      • 3、swap 函数的函数栈帧的开辟
        • (1)swap 栈帧空间的开辟和默认初始化
        • (2)swap 局部变量的初始化
        • (3)swap 函数栈帧的销毁
      • 4、main 函数栈帧的销毁
  • 四、函数栈帧创建图
      • 结束语

一、什么是函数栈帧

函数栈帧是指在程序执行过程中,每个被调用的函数会在内存中分配一块特定的存储区域,用于存储函数的局部变量、函数参数、返回地址以及其他与函数执行相关的信息。函数栈帧的结构如下:

返回地址:函数执行完成后,程序需要返回到调用该函数的地方继续执行,返回地址就是用来记录函数返回的地方。

参数:函数的参数被传递给函数,并保存在栈帧中的特定位置,供函数使用。

局部变量:函数内部定义的变量被保存在栈帧中的特定位置,它们的作用域仅限于函数内部,每次函数调用都会为局部变量分配新的内存空间,函数的参数的传递是从右向左传递

上一个函数的栈帧指针:每个栈帧都有一个指向上一个函数栈帧的指针,通过该指针,可以访问上一个函数的局部变量和参数。

函数栈帧的创建和销毁是由编译器和操作系统负责管理的,一般情况下,函数调用时会在栈上分配一个新的栈帧,函数执行完毕后栈帧会被销毁。通过栈帧的创建和销毁,程序能够灵活地管理函数的调用和返回。

二、常见的寄存器

eax:通用寄存器,存储数据和地址。

ecx:通用寄存器,存储临时值。

edi:通用寄存器,存储目的操作数地址。

ebx:通用寄存器,存储通用数据。

esi:通用寄存器,存储源操作数地址。

三、函数指令

call:当执行call指令时,会将当前的指令指针保存到堆栈中,进入子程序

ret:当执行ret指令时,会从堆栈中取出之前保存的指令指针,用于从一个子程序中返回到调用的地方。

push:将数据压入栈中。push指令的作用是将指定的数据(可以是寄存器中的值或者内存中的数据)压入堆栈(栈)中。

mov:将数据从一个位置复制到另一个位置。

sub:减法操作。sub指令的作用是将指定的值从目标位置减去。

lea:加载有效地址。lea指令的作用是将内存地址加载到寄存器中

pop:将数据从栈中弹出。

rep stos:重复填充操作。rep stos指令的作用是将指定的字节或字复制到连续的内存位置

三、函数栈帧的创建和销毁

(一)普通值传递

1、开始执行函数

下面的过程都是基于汇编代码,可以发现main 函数也是由其他的函数进行调用的,这个函数就是__tmainCRTStartup.
在这里插入图片描述
在这里插入图片描述

2、main函数的函数栈帧的开辟

(1)main 栈帧空间的开辟和默认初始化

在这里插入图片描述

(2)main 局部变量的初始化

在这里插入图片描述

(3)函数传参和 swap 函数的调用

在这里插入图片描述
在这里插入图片描述

3、swap 函数的函数栈帧的开辟

(1)swap 栈帧空间的开辟和默认初始化

在这里插入图片描述

(2)swap 局部变量的初始化

在这里插入图片描述

(3)swap 函数栈帧的销毁

在这里插入图片描述

4、main 函数栈帧的销毁

在这里插入图片描述

四、函数栈帧创建图

在这里插入图片描述

结束语

这篇文章就到此结束了,文章完成比较困难,当作笔记发布了吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

S-Procedure的基本形式及使用

理论 Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- \textbf{Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- } Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- tions w.r.t. x ∈ C M 1 \mathbf{x}\in\mathbb{C}^M\times1 x…

Leetcode—815. 公交路线【困难】(unordered_map+queue)

2024每日刷题&#xff08;163&#xff09; Leetcode—815. 公交路线 bfs实现代码 class Solution { public:int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {if(source target) {return 0;}unordered_map<int, vector…

如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程

安卓手机使用FCL启动器安装我的世界Java版游戏的教程。如何用安卓玩Java版Minecraft 视频教程&#xff1a;https://www.bilibili.com/video/BV1CctYebEzR/ 前言 目前&#xff0c;安卓设备上可以用来运行Java版Minecraft的启动器主要有以下几款&#xff1a; PojavLauncher&a…

Matlab-Matpower制作IEEE14-电力虚假数据注入攻击FDIA数据集

文章目录 1. 加载Matpower-IEEE14电力数据2. 导入原始数据集两个数据集结合的意义潮流分析和状态估计的意义 3. 初始化变量4. 分离有功和无功功率4. 潮流计算5. 生成测量向量6. 选择是否篡改数据7. 状态估计和雅可比矩阵8. 保存未篡改数据9. 篡改数据生成FDIA仿真数据集完整代码…

硬件工程师笔试面试——显示器件

目录 14、显示器件 14.1 基础 显示器件实物图 14.1.1 概念 14.1.2 工作原理 14.1.3 性能参数 14.1.4 应用领域 14.2 相关问题 14.2.1 液晶显示器(LCD)和有机发光二极管 (OLED)显示器在性能上有哪些主要区别? 14.2.2 在设计显示器时,如何平衡分辨率和刷新率以满足不…

C#:强大编程语言的多面魅力

C#&#xff1a;强大编程语言的多面魅力 一、C# 语言的特点与优势 &#xff08;一&#xff09;简洁的语法与精心设计 C# 在继承 C 和 C 的强大功能的同时&#xff0c;去掉了一些复杂特性&#xff0c;如宏和多重继承&#xff0c;使得语言更加简洁易懂。C# 是一种面向对象的语言…

根文件夹下文件重复检测

功能介绍&#xff1a;在传入Windows路径后&#xff08;例如“D:\小米云服务下载”&#xff09;&#xff0c;遍历文件夹下所视频有文件&#xff08;包括子文件夹下的视频文件&#xff0c;其他类型不做判断&#xff09;&#xff0c;判断视频文件是否重复&#xff08;由于视频文件…

运筹说 第125期 | 存储论经典例题讲解1

通过前几期的学习&#xff0c;我们已经学会了存储论的基本概念、确定型存储模型、单周期的随机型存储模型、其他的随机型存储模型以及存储论应用研究中的一些问题。在实际工作中&#xff0c;我们能发现存储论在能源行业中有着许多应用&#xff0c;本期小编选择了其中一些确定型…

错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain

安装 zookeeper-3.8.4 版本的时候&#xff0c;启动zk打印如下错误日志 错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain后面查了下发现 zookeeper 3.5.5 版本以后&#xff0c;已编译的 jar 包&#xff0c;尾部有 bin下载的时候应该下载 编译后…

裸土检测算法实际应用、裸土检测算法样本、裸土检测算法精准检测

裸土检测算法是一种前沿的图像识别技术&#xff0c;它通过利用先进的图像处理技术和机器学习算法&#xff0c;从卫星图像、无人机拍摄的图像或其他地面监测数据中提取出裸土区域&#xff0c;并对其进行精确的分类和分析。 与传统的地面勘察方法相比&#xff0c;裸土检测算法具有…

1. YOLOv10: Real-Time End-to-End Object Detection

一、全文概述 文章主要介绍了YOLOv10在实时端到端目标检测方面的改进和创新。简要概述&#xff1a; 1.1 背景与挑战&#xff1a; 实时目标检测在计算机视觉领域具有重要意义&#xff0c;广泛应用于自动驾驶、机器人导航等场景。YOLO系列因其在性能和效率之间的有效平衡而受到…

fiddler抓包04_基础设置(字体/工具栏/抓包开关/清空)

课程大纲 1. 设置字体 菜单栏 “工具”&#xff08;tool&#xff09; - “选项”&#xff08;options&#xff09; - “appearance”&#xff0c;设置字号和字体后&#xff0c;点击确认&#xff0c;立刻生效&#xff08;无需重启&#xff09;。 2. 展开/收起工具栏 菜单栏 “…

Kotlin-Flow学习笔记

Channel 和 Flow 都是数据流&#xff0c;Channel 是“热”的&#xff0c;Flow 则是“冷”的。这里的冷&#xff0c;代表着 Flow 不仅是“冷淡”的&#xff0c;而且还是“懒惰”的。 Flow 从 API 的角度分类&#xff0c;主要分为&#xff1a;构造器、中间操作符、终止操作符。今…

Qt开发技巧(四)“tr“使用,时间类使用,Qt容器取值,类对象的删除,QPainter画家类,QString的转换,用好 QVariant类型

继续讲一些Qt技巧操作 1.非必要不用"tr" 如果程序运行场景确定是某一固定语言&#xff0c;就不需要用tr,"tr"之主要针对多语种翻译的&#xff0c;因为tr的本意是包含英文&#xff0c;然后翻译到其他语言比如中文&#xff0c;不要滥用tr&#xff0c;如果没有…

【算法】差分思想:强大的算法技巧

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

Linux(CentOS8)服务器安装RabbitMQ

我安装了很久都没有成功, 各种问题, 每次的异常都不一样, 现将成功安装过程做个总结 安装前工作 确保已经安装了一些基础工具和组件库 下载安装包 https://www.erlang.org/patches/otp-24.3.4.5 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.15/ra…

Python热频随机森林分类器算法模型模拟

&#x1f3af;要点 研究发射测量斜率和时滞热频率表征&#xff0c;使用外推法计算三维磁场并定性比较使用基于焓的热演化环模型模拟每条线的热力学响应&#xff0c;测试低频、中频和高频热场景使用光学薄、高温、低密度等离子体的单位体积辐射功率或发射率公式等建模计算使用直…

GPU加速生物信息分析的尝试

GPU工具分类 实话实说&#xff0c;暂时只有英伟达的GPU才能实现比较方便的基因组分析集成化解决方案&#xff0c;其他卡还需要努力呀&#xff0c;或者需要商业公司或学术团体的努力开发呀&#xff01;FPGA等这种专用卡的解决方案也是有的&#xff0c;比如某测序仪厂家&#xf…

基于stm32使用ucgui+GUIBuilder开发ui实例

1 项目需求 1.1 基于Tft 触摸屏实现一个自锁按键 1.2 按键在按下后背景色需要进行变化&#xff0c;以凸显当前按键状态&#xff08;选中or 未选中&#xff09; 1.3 按键选中时对某一gpio输出低电平&#xff0c;非选中时输出高电平 2 移植 ucgui UCGUI的文件数量很大&#x…

happens-before

happens-before 一、happens-before 规则的含义 happens-before 是 Java 内存模型&#xff08;JMM&#xff09;中用于定义多线程之间操作顺序的规则集合。它规定了如果一个操作 A happens-before 另一个操作 B&#xff0c;那么 A 的结果对 B 可见&#xff0c;并且在 B 执行之…