C语言--探索函数栈帧的创建与销毁

news2025/1/18 7:26:08

目录

为main函数开辟栈帧 

创建变量

传参

为自定义函数开辟栈帧  

返回


        局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?形参与实参的关系?函数怎么调用与返回?

我们用VS2013的环境进行探索(不同编译器下函数调用过程中栈帧的创建略有差异)。

        需要知道的常识:1.寄存器(eax,ebx,ecx,edx,ebp,esp...)。其中ebp,esp这两个寄存器是存放地址的,这两个地址用来维护函数栈帧。2.每一个函数调用,都要在栈上开辟一块空间。

我们用一段简单的代码进行演示。

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;
}

 

 我们发现main函数被调用了?那么是被谁调用的呢?

我们可以清楚得看到main函数也是别的函数调用的。

因此:在vs2013中main函数也是被别的函数调用的,它们的关系是:

 我们转到反汇编

为main函数开辟栈帧 

第一步是push ebp,并且esp也改变了,我们在监视窗口可以看到:

 显而易见,esp减少了4。再看内存:

ebp确实压进了内存。

第二步:将esp的位置移动到ebp。

 第三步:将esp减去一个值。

 这样就为main函数与开辟好了一块空间。

 第四步:压进去三个寄存器(先不管,后面会弹掉).

 

 

 内存窗口也可以清晰得看到压进去了三个。

第五步:lea(load effecitve address)加载有效地址,把一个地址加载到edi里面去。

(显示符号名勾选)

 ebp-0E4h是黑箭头指向的位置。

 

 

 第六步:从edi开始,向下的39h个dword(4字节空间)的数据,即每次初始化4个字节,总共39h次,改成eax的内容(CCCCCCCC)

 ​​​​​​​

 

  到这我们就要开始执行有效代码了,把0A放到ebp-8的位置。

 

 内存中也确实如此。所以如果变量不初始化就是随机值。

创建变量

再接下来就是创建b变量。

 

 

 同样创建c变量。

 

传参

把ebp-14h(b  20)放到eax中,压栈。然后同样的方式处理b。(传参)

 下面执行call(调用)指令,我们要记住call指令的地址,执行后会把call指令的下一条指令的地址压栈。

 

 ​​​​​​​

为自定义函数开辟栈帧  

再往下执行,我们进入Add函数,前期建立栈帧和main函数一样。

 给一块空间给变量z,并初始化为0;

 

 下面就开始执行z=x+y了。把ebp+8 (a')的值给eax,再把eax的值加上ebp-0Ch处的值,即eax的值为30,再将eax的值移动到ebp-8的位置,即完成了c=30.

 所以在调用函数前,参数已经传过去了。形参不是在Add函数内部创建的。即,a'为x,b'为y。vs2013下参数从右向左传。形参是实参的一份临时拷贝

返回

我们继续来看怎么返回。把ebp-8的值(算好的值)放到eax中。执行三次pop(弹出)指令,将原先压进去的三个寄存器弹出。把ebp赋值给esp。再pop(弹出)把结果弹到ebp中(取栈顶)。ebp就回到了原先main的栈底。

 ​​​​​​​

 此时我们应该从call指令的下一条指令开始执行,ret指令,就是弹出栈顶(call指令的下一条指令的地址)然后跳到那去。

 exp跳到+8的位置,即将x,y还给了操作系统(销毁)。将eax的值放到ebp-20h处。

 

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

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

相关文章

Https为什么比Http安全?

Https是在Http之上做了一层加密和认证; 主要的区别是Https在TLS层对常规的Http请求和响应进行加密,同时对这些请求和响应进行数字签名。 Http请求的样式: 明文传输,通过抓包工具可以抓到 GET /hello.txt HTTP/1.1 User-Agent: c…

【三】Netty 解决粘包和拆包问题

netty 解决粘包和拆包问题TCP 粘包/拆包的基础知识粘包和拆包的问题说明TCP粘包/拆包 原因粘包和拆包的解决策略tcp 粘包/拆包 的问题案例大致流程如图:代码展示(jdk1.7)TimeServer 服务端启动类TimeServerHandler 服务端业务处理类TimeClient 客户端启动类TimeClientHandler 客…

Python入门注释和变量(2)

1.1输入 a input("请输入内容") print("您输入的内容是:{}".format(a)) 输入的内容会帮我们转换成字符串形式 2.1运算符 2.1.1算数运算符 以a 10 , b 20 为例进行运算 运算符描述实例加两个对象相加ab输出结果30-减得到负数或是一个数减…

You辉编程_有关boot

一、SpringBoot多环境配置 1.环境的配置信息 (1)application.properties #指定默认使用dev的配置 spring.profiles.activedev (2)application-dev.properties #开发环境 server.port8080 branchdev (3)application-prod.properties #测试环境 server.port8081 branchtest2…

【Nacos】Nacos介绍和简单使用

Nacos介绍及简单使用 Nacos介绍 Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供了注册中心、配置中心和动态DNS服务三大功能。能够无缝对接SpringCloud、Spring、Dubbo等流行框架。 …

环境搭建 | MuMu模拟器 - Window10/11 系列

🖥️ 环境搭建 专栏:MuMu模拟器 - Window10/11 系列 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ …

FLV格式分析

1.FLV封装格式简介 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积小、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤ FLV格式封装的⽂件后缀为.flv。 2.FLV封装格式分析 FLV封装格…

视频监视计划和设计软件丨IP Video System Design Tool功能简介

本软件提供快速轻松地设计现代视频监视系统之新方式 产品功能 • 降低寻找更好的视频摄像机位置的成本时,增加您的安全系统效能。 • 极短时间内,即可计算出精确的摄像机镜头焦距长度与视角。 • 使用2D和3D建模,检查每台摄像机的视野并寻…

新应用——合同管理应用,实现合同无纸化管理

合同管理应用,是建立在低代码技术基础上,结合企业的管理方式,为企业提供决策、计划、控制与经营绩效评估的全方位、系统化的合同管理解决方案。百数合同管理系统应用提供了从合同模板、合同签订、合同收付款和合同发票管理、合同归档&#xf…

我是如何两个月通过软件设计师的!

软设刚过,分享下经验 个人感觉不是很难,我都不好意思说我没怎么复习,本来以后自己要二战了,没想到,成绩还挺惊喜,大概是因为最后几天冲刺到点子上了。 攻略: 搜集资料,搜集考试相…

一、Kubernetes介绍

文章目录1.常见容器编排工具2.kubernetes简介3.kubernetes组件4.kubernetes概念1.常见容器编排工具 Swarm:Docker自己的容器编排工具Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用Kubernetes:Google开源的的容器…

vector的实现和使用中的常见错误

文章目录实现构造函数时的调用模糊实现insert函数时的迭代器失效使用erase函数时的迭代器失效实现reserve函数使用memcpy函数导致的浅拷贝实现构造函数时的调用模糊 vector的构造函数有这四种,其中有两种在实例化的时候会有调用模糊的问题&#xff1a; vector<int> v(10…

SpringBoot自定义配置的提示

文章目录1. 引入依赖2. 开启 IDEA 配置3. 使用 ConfigurationProperties 自定义配置4. 编译项目&#xff0c;自动生成 spring-configuration-metadata.json 文件文件中的属性值介绍5. 可以看到有提示了官方文档&#xff1a;https://docs.spring.io/spring-boot/docs/2.2.2.RELE…

机器视觉(七):图像分割

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

whistle的使用【前端抓包】

前言 抓包工具看起来只是测试要用的东西&#xff0c;其实对前端作用也很多&#xff0c;因为我们也要模拟请求、mock数据、调试。站在巨人肩膀上永远不亏! whistle能解决的痛点 一、看请求不方便 跳页、支付时候上一页的请求结果看不到&#xff0c;h5、小程序newWork不能在电…

Raki的读paper小记:Continual Learning of Natural Language Processing Tasks: A Survey

第一次写综述的小记&#xff0c;也将是我读完的第一篇综述&#xff08; 最开始因为可乐老师的原因&#xff0c;接触到了持续学习&#xff0c;然后从一开始的音频到自己读了一些ICLR的paper找idea做NLP的持续学习&#xff0c;然后做了自己第一个粗糙的工作&#xff0c;在杰哥的…

Hadoop高手之路9-Azkaban工作流管理器

文章目录Hadoop高手之路9-Azkaban工作流管理器一、工作流概述1. 工作流简介2. 常见的工作流调度工具1) Azkaban2) Oozie二、Azkaban简介1. Azkaban组成结构2. Azkaban的部署模式1) solo-server mode&#xff08;独立服务器模式&#xff09;2) two server mode&#xff08;双服务…

8Manage SRM:使用采购管理软件进入现代化模式

在企业运营发展中&#xff0c;采购组织一直是一个非常重要的部门&#xff0c;它会直接影响企业的采购成本效益。在采购活动中&#xff0c;如果采用传统线下的采购方式&#xff0c;容易导致采购信息不集中&#xff0c;效率低&#xff0c;出错率高&#xff0c;最终损害企业的利益…

社区发现系列02-算法介绍

hello, 大家好&#xff0c;欢迎来到阿君聊风控&#xff0c;我是阿君&#xff08;一名有7年互金和电商风控经验的算法工程师&#xff09;。在上篇文章https://blog.csdn.net/u010569893/article/details/128565829?spm1001.2014.3001.5502 中我们了解到可以用社区发现技术来对图…

全面兼容各端的动画库PAG,对标Lottie

感谢Tencent 开源了PAG库&#xff0c;终于有了国人自己的动画库了&#xff0c;该库兼容&#xff1a;移动端&#xff0c;桌面端&#xff0c;&#xff0c;WEB端&#xff0c;还有小程序端&#xff0c;真可谓用心了&#xff0c;而且PAG库相对其他库&#xff0c;使用的pag文件更小&a…