函数栈帧的创建与销毁剖析

news2024/11/18 1:33:47

目录

一、前言

二、基础知识介绍

2.1 寄存器介绍

2.2、汇编指令介绍

三、函数栈帧的创建销毁过程

3.1 调用main函数的函数

3.2 main函数开辟栈帧

3.3 在main函数中创建变量

3.4 调用Add函数前的准备

3.5 为Add函数开辟栈帧

3.6 在Add函数中创建变量并运算

3.7 Add函数栈帧的销毁

3.8 返回main函数栈帧


一、前言

在C语言的过程中,我们心中难免有一些懵懂的地方。譬如:

1.局部变量到底是怎么在栈上创建的?

2.为什么局部变量不初始化为随机值?

3.函数是怎么传参的?传参的先后顺序是什么?

4.形参和实参是什么关系?

5.函数调用是怎么实现的?

6.函数调用后是怎么返回的?   

学习完函数栈帧的创建与销毁,想必就能有一个比较清晰的认识了

本文的调试结果是使用vs2013和vs2019反汇编调试而出的,不同编译器函数栈帧的创建销毁过程略有不同,具体细节取决于编译器的实现。(越高级的编译器封装越好,越不易观察学习

二、基础知识介绍

2.1 寄存器介绍

寄存器名称功能
eax    累加器,是多数加法乘法指令的缺省寄存器
ebx基地址寄存器,在内存寻址时存放基地址
ecx计数寄存器,用于循环操作,比如重复的字符存储操作,或者数字统计
edx作为eax的溢出寄存器,总是被用来放整数除法产生的余数
esi

源变址寄存器,主要用于存放存储单元在段内的偏移量

通常在内存操作指令中作为“源地址指针”使用

edi目的变址寄存器,主要用于存放存储单元在段内的偏移量
eip控制寄存器,存储CPU下次所执行的指令地址(存放指令偏移地址)
esp

栈指针寄存器(extended stack pointer),其内存放着一个指针。

该指针永远指向栈最上面一个栈帧的栈顶。esp用于堆栈操作,被形象地称为栈顶指针

ebp

基址指针,指栈的栈底指针。基址指针寄存器(extended base pointer)。

一般与esp配合使用,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部

2.2、汇编指令介绍

指令名称作用
push进栈指令将源操作数压入栈中
pop弹栈指令从栈中弹出双字或字数据至目的操作数中
mov传送指令把一个字节、字、或双字从源操作数传送至目的操作数
add加法指令目的操作数加源操作数,结果送至目的操作数
sub减法指令目的操作数减源操作数,结果送至目的操作数
lea取有效地址指令将源操作数的有效地址传送到通用寄存器
call过程调用指令程序下一条指令的位置的地址压入堆栈中,并转移到调用的子程序
ret段内过程返回指令从调用过程返回,继续执行主程序。
jmp无条件转移指令使程序无条件地转移到指令规定的目的地址去执行指令

字(word):表示两个字节长度的数值      双字(dword):表示四个字节长度的数值

三、函数栈帧的创建销毁过程

接下来使用下述代码进行演示 (语句简单,易于观察)

#include <stdio.h>
int Add(int x, int y)
{
	int z = 0;
	z = x + y;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = Add(a, b);
	printf("%d\n", c);
	return 0;
}

3.1 调用main函数的函数

vs2013进入调试,打开窗口中的调用堆栈,F10不断调试,得到下图

可以发现main函数也是由别的函数(__tmainCRTStartup函数)调用的,而__tmainCRTStartup函数则是由mainCRTStartup函数调用的。

3.2 main函数开辟栈帧

3.3 在main函数中创建变量

在main函数开辟的栈帧中创建变量

3.4 调用Add函数前的准备

3.5 为Add函数开辟栈帧

3.6 在Add函数中创建变量并运算

3.7 Add函数栈帧的销毁

3.8 返回main函数栈帧

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

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

相关文章

给手机上液冷?谈谈华为Mate 60系列手机专属黑科技—— “微泵液冷”手机壳

最近&#xff0c;有一个手机配件吸引了我的注意——华为的微泵液冷壳。 简单来说&#xff0c;就是在手机壳里装了无线充电微泵&#xff0c;为手机实现外置水冷的能力。让手机壳在“外观装饰”和“防摔保护”的功能性上额外加了一个“降温提性能”的作用。 接下来&#xff0c;本…

ATFX汇市:9月非农再超预期,高利率并未导致美国宏观经济收缩

ATFX汇市&#xff1a;据美国劳工部数据&#xff0c;9月季调后非农就业人口33.6万人&#xff0c;远高于前值18.7万人&#xff0c;高于预期值17万人&#xff0c;创出今年一月份以来的新高。亮眼的就业数据意味着美国宏观经济仍处于急速扩张状态&#xff0c;高利率的破坏性远低于此…

【c#】adapter.fill(dt)报错specified cast is not valid

报错信息&#xff1a; 报错specified cast is not valid,指定转换类型无效。 原因 查出来的数据有小数&#xff0c;且小数位数较多&#xff0c;问题就出现在这里&#xff0c;ORacle可以查出精确度高的数据&#xff0c;但是C#没办法查出来&#xff0c;就导致了有数据类型转换&…

区块链的两个核心概念之一签名, 另一个是共识.

Alice的公私钥&#xff0c; 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花&#xff0c;即重复宣称所有权&#xff0c; 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…

【mmdetection代码解读 3.x版本】以Fcos+FasterRcnn为例

文章目录 前言RPN部分的代码1. loss函数&#xff08;two_stage.py&#xff09;1.1 loss_and_predict函数&#xff08;base_dense_head.py&#xff09;1.1.1 loss_by_feat函数&#xff08;fcos_head.py&#xff09;1.1.1.1 get_targets函数 1.1.2 predict_by_feat函数&#xff0…

fatal: Not a git repository (or any parent up to mount point /home)解决方法

Git遇到一个问题&#xff1a; fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). 解决办法&#xff1a;git init 错误信息指出不是一个git仓库&#xff0c;或者它的父级目录…

【网络安全】如何保护IP地址?

使用防火墙是保护IP地址的一个重要手段。防火墙可以监控和过滤网络流量&#xff0c;并阻止未经授权的访问。一家网络安全公司的研究显示&#xff0c;超过80%的企业已经部署了防火墙来保护他们的网络和IP地址。 除了防火墙&#xff0c;定期更新操作系统和应用程序也是保护IP地址…

JavaScript(CSS)动画引擎汇总

汇总记录前端实现动画相关的库 1、animejs animejs是一个轻量级的JavaScript动画库&#xff0c;具有简单但功能强大的API。 它适用于CSS属性&#xff0c;SVG&#xff0c;DOM属性和JavaScript对象。 官网anime.js • JavaScript animation engine anime.js - a Collection by…

怎么把amr格式转换成mp3?

怎么把amr格式转换成mp3&#xff1f;AMR格式是一种被广泛应用于语音通信的音频格式。在手机通话录音、语音留言和通信等场景中&#xff0c;AMR格式常被用来存储和传输语音数据。此外&#xff0c;AMR格式也常见于专用的录音设备和录音应用程序中&#xff0c;这些设备和应用通常用…

linux下利用find 命令查找某一个目录的路径

例子 在/data/目录下查找以nginx起头命名的目录 find /data/ -name nginx* -type d 其中 /data/ 代表本例中的查找范围 -name参数指定要查找的目录名称 *代表后面通配 -type 代表查找的类型 d 代表directory目录之意

高效节能双冷源空调架构在某新建数据中心项目中的应用

随着互联网、通信、金融等行业的发展&#xff0c;数据中心产业迈入高质量发展新阶段&#xff0c;在国家“双碳”战略目标和“东数西算”工程的有力指引下&#xff0c;数据中心加快向创新技术、强大算力、超高能效为特征的方向演进。数据中心已经成为支撑经济社会数字化转型必不…

用SegNext训练dms数据集(一)

数据集官方格式&#xff1a; 在mmseg/datasets下对数据集进行初始定义 在configs/_ _base_ _/datasets下对数据加载进行定义 在configs/下选择需要的模型参数进行修改 找了两个模型fcn和danet进行训练 类别数应该等于 n 1, 也就是多少类别背景。46类应该是47 返回tools/trai…

[GXYCTF 2019]Ping Ping Ping题目解析

本题考察的内容是rce绕过&#xff0c;本事过滤的东西不算多也算是比较好绕过 基础看到这种先ping一下试试看 输入127.0.0.1看看有啥东西 有回显说明可以接着往下做 借用RCE漏洞详解及绕过总结(全面)-CSDN博客这个大佬整理的rce绕过 ;A;B无论真假&#xff0c;A与B都执行&…

How to transition ION to DMA-BUF heaps

目录 DMA-BUF ION Call flow DMA-BUF heaps Differences between ION and DMA-BUF heaps Why replace ION with DMA-BUF heaps Reference 相关代码 DMA-BUF heaps To Replace ION How to in Kernel Space How to in User Space Ueventd sepolicy Transition Exam…

JavaScript入门——(5)函数

1、为什么需要函数 函数&#xff1a;function&#xff0c;是被设计为执行特定任务的代码块 说明&#xff1a;函数可以把具有相同或相似逻辑的代码“包裹”起来&#xff0c;通过函数调用执行这些被“包裹”的代码逻辑&#xff0c;有利于精简代码方便复用。 比如之前使用的ale…

华为数通方向HCIP-DataCom H12-831题库(多选题:201-220)

第201题 DHCP Snooping是一种DHCP安全特性,这项技术可以防御以下哪些攻击? A、DHCP Server仿冒者攻击 B、针对DHCP客户端的畸形报文泛洪攻击 C、仿冒DHCP报文攻击 D、DHCP Server的拒绝服务攻击 答案:ABD 解析: 第202题 两台PE之间通过MP-BGP传播VPNv4路由,以下哪些场景…

ContextInfo.get_full_tick 获取最新分笔数据

resultContextInfo.get_full_tick(ContextInfo.trade_code_list) print(result[ContextInfo.trade_code_list[0]][lastPrice])#打印最新价

Gnuradio+AM解调

1. https://wiki.gnuradio.org/index.php/PLL_Carrier_Tracking 2. https://wiki.gnuradio.org/index.php?titleComplex_to_Mag#Example_Flowgraph

pandas 处大 csv 文件:chunk

用 pandas 读取 csv 的常见方法&#xff1a; import pandas as pddf pd.read_csv("your_csv_file.csv") 但对于大型的 csv 文件&#xff0c;直接读取可能会报错 numpy.core._exceptions._ArrayMemoryError 我的机器是 24G 内存&#xff0c;直接读大概只允许单个最…

交通物流模型 | MDRGCN:用于多模式交通客流预测的深度学习模型

城市交通拥堵是造成交通事故的重要原因,也是城市发展的主要障碍。通过学习历史交通流数据,我们可以预测未来一些区域的交通流,这对城市道路规划、交通管理、交通控制等都有重要意义。然而,由于交通网络拓扑结构的复杂性和影响交通流的因素的多样性,交通模式往往是复杂多变…