C语言-------函数栈帧的创建和销毁------剖析描骨

news2025/1/16 8:20:56

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

——————————————————————————————————————

知识的简单介绍

寄存器(是集成于cpu,不在内存上)

eax、ebx、ecx、edx、ebp、esp

其中ebp、esp这两个寄存器中存放的是地址,是来维护函数栈帧

每一个函数调用,都需要在栈区创建一个空间
int add(int a, int b)
{
	int z = 0;
	z = a + b;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = add(a, b);
	printf("%d", c);


	return 0;
}

esp 和edp存放的是函数的栈帧的,哪个函数调用,这两个寄存器就会跑到那里去,

栈区申请空间的习惯是:先使用高地址,再使用低地址,所以ebp又称栈低地址,esp称栈顶指针

当我们进一步调试的时候使用调用栈堆观察就会发现main函数会被其他函数调用

 当我们使用反汇谝查看就会有

 这是啥原因呢?

原因是调用main函数的函数正在使用ebp和esp,当调用到

main函数的时候esp就会变动,指向main函数的地址 

 push  ebp就是在栈区申请一块空间存放ebp的值,这个值是是invoke_main()栈低地址的值,字节大小为4个字节

 当调用了main()函数并创建了申请ebp空间,esp就会指向ebp空间的栈顶地址,运行下一步,然后把esp的值给ebp里面,ebp就指向ebp空间的栈顶地址,运行下一步,然后esp -0E4h得到main函数的栈顶地址,并指向他

, 

每次(push  名字  )esp会自动指向这块空间的栈顶地址

在反汇谝中

 edi存放ebp-24h的值

word代表两个字节, dword代表四个字节,

意思就是从edi开始,给ecx个(9个)四个字节全部改为0CCCCCCC, 结束点是ebp指向的地址

压栈 :往栈里面开辟一块空间存放值

出栈:从栈删除这块空间

 往ebp-8的地址存放10.ebp-14h存放14h

 

接下来遇见 push eax 就会压栈,

 运行到call ( 调用的意思) 并压栈了一个,里面存放call下一条指令的地址

 

 

 

接下来我们就会进入到add函数里面去了 ,申请ebp空间,esp指向ebp空间的栈顶地址,赋予给ebp,然后esp减去0CCh,申请ebx、esi、edi,最终esp指向edi的栈顶地址,把ebp-0Ch赋值给edi ,从edi开始的三个4个字节的内容改为0CCCCCCCC

最后当返回时

 pop 就是出栈的意思, 当我们pop掉该函数ebp空间并把结果返回给ebp,edp就会指向上一个函数,原因是一个函数的ebp空间没有pop掉

ret返回,怎么返回呢?

 在红色框里面存放了上一个函数的call下一条指令的地址,ret就是返回到这里去

总结:

一个函数的创建先要创建好一块栈帧,esp和ebp进行维护,和函数的调用并返回是在一块栈帧上存储了调用该函数的函数call的下一条指令的地址,函数的形参传值是找到实参的值进行传值,

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

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

相关文章

Talk | 新加坡国立大学博士生施宇钧:DragDiffusion-基于扩散模型的关键点拖拽图片编辑

本期为TechBeat人工智能社区第518期线上Talk! 北京时间8月2日(周三)20:00, 新加坡国立大学博士生—施宇钧的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “DragDiffusion-基于扩散模型的关键点拖拽图片编辑”,他…

浅谈机器视觉

目录 1.什么是机器视觉 2.学习机器视觉需要掌握的知识 3.机器视觉的由来 4.机器视觉带来的福利 1.什么是机器视觉 机器视觉(Computer Vision)是人工智能领域中的一个分支,旨在通过模仿人类的视觉系统,使计算机能够理解和解释图…

使用uni-app的uniCloud 云数据库入门:实现一个简单的增删改查

官方云数据库文档 前置步骤使用uni-app新建一个uniCloud项目 [外链图片转存失败,源站可能有防盗官方云数据库文档]!链机制,建议将()https://uniapp.dcloud.net.cn/uniCloud/hellodb.html)] 新建表 这里我加了几个测试字段 createTime、remark、money // 文档教程: https://un…

深度强化实车部署教程

强化學習仿真實車部署 前言 这里讲一下如何部署 有两种方式部署: 第一种实车远程控制:即通过roscore中的IP设置实现远程控制;具体可以参考turtlebot3的PC连接turtlebot3并控制的教程;我使用的是这种方法; 第二种直…

一条命令重启supervisor所有RUNNING状态的进程

supervisorctl status | grep RUNNING | awk {print $1} | xargs -n1 supervisorctl restart

选择适合的项目管理系统,了解有哪些选择和推荐

随着科技的进步和全球竞争的加剧,项目管理已经成为企业成功的关键要素。为了更好地组织和监控项目,许多企业和组织正在采用项目管理系统(PMS)。本文将探讨项目管理系统的主要组成部分以及其在实际应用中的优势。 “项目管理系统有哪些?国际上比较常见的…

GCC版本升高到11.3后编译之前同样的C++代码出现的若干错误

目录 1 gtest-death-test.cc:1301:24: error: ‘dummy’ may be used uninitialized 2 error: ‘void* memcpy(void*, const void*, size_t)’ copying an object of non-trivial type ‘Eigen::internal::Packet4c’ 3 error: comparison is always true due to limited ra…

京东开源的、高效的企业级表格可视化搭建解决方案:DripTable

DripTable 是京东零售推出的一款用于企业级中后台的动态列表解决方案,项目基于 React 和 JSON Schema,旨在通过简单配置快速生成页面动态列表来降低列表开发难度、提高工作效率。 DripTable 目前包含以下子项目:drip-table、drip-table-gene…

JDK8:Stream流0基础使用与深入理解,Stream流源码分析

文章目录 一、概述二、集合操作演进对比1、JDK7传统方式2、JDK8 使用Stream3、小结 三、流实现思想1、外部迭代2、内部迭代 四、函数式编程五、流操作详解1、流的分类(1)中间操作(2)终止操作 2、构建流(1)基…

元素内容必须由格式正确的字符数据或标记组成

mybatis报错&#xff1a; 元素内容必须由格式正确的字符数据或标记组成 代码&#xff1a; 原因分析&#xff1a; 经过查找&#xff0c;使用 解决方案&#xff1a; 使用<![CDATA[ SQL语句 ]]> 将含有<、>、<、>的sql语句包含进去。 第二种方法&#…

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…

《MySQL》第十四篇 COUNT(*)和 COUNT(1)的区别

本文旨在介绍COUNT(*&#xff09;&#xff0c;COUNT(1&#xff09;&#xff0c;COUNT(col&#xff09;三者之间区别和使用索引的情况&#xff0c;count() 函数是用来统计行数用的&#xff0c;以下内容均是个人实践模拟结果&#xff0c;仅供参考&#xff1b; 阿里规范中详细描述…

seata 启动报错 Could not create connection to database server

文章目录 报错信息1、驱动包问题2、高版本驱动类名称问题3、url 时区问题4、驱动包位置问题 环境&#xff1a; 操作系统&#xff1a;windows 10seata版本&#xff1a;seata-server-1.6.1数据库版本&#xff1a;mysql 8.0.33 报错信息 seata启动报错com.mysql.jdbc.exception…

流程图如何制作?5步快速画出好看的流程图!

流程图是一种图形化工具&#xff0c;描述某个过程或者操作的步骤&#xff0c;以及某种业务系统的具体流程。流程图通常由各种图形符号、形状、箭头组成&#xff0c;可以清晰的表示出流程或系统中各种步骤、每个环节之间的关系、条件判断、数据的流动和处理过程等。 在线流程图软…

npm install时出现的问题Failed at the node-sass@4.14.1 postinstall script

从阿里云上拉取下来项目后&#xff0c;首先使用npm install 命令进行安装所需依赖&#xff0c;意想不到的事情发生了&#xff0c;报出了Failed at the node-sass4.14.1 postinstall script&#xff0c;这个问题&#xff0c;顿时一脸懵逼&#xff1b;询问前端大佬&#xff0c;给…

斯坦福:小鼠植入人脑组织后继续生长

美国科学家的一项新研究表明&#xff0c;移植到大鼠体内的微型人脑结构可以发送信号&#xff0c;并对大鼠胡须感受到的环境线索作出反应。该研究证明从人类干细胞中生长的神经元可以与活体啮齿动物的神经细胞结合&#xff0c;或可为人类大脑疾病的治疗提供新方法。相关研究结果…

《云管理产品与服务图谱(2023)》发布!MIAOYUN荣登【运维平台】板块

2023年7月25日&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;和中国通信标准化协会联合主办的2023第十届可信云大会在北京召开。大会以“云领创新 算启新篇”为主题&#xff0c;就云计算产业发展现状和趋势等进行了研讨&#xff0c;并发布了《…

Linux权限小结

Linux权限小结 权限的基本介绍 ls -l中显示的内容如下&#xff1a;drwxr-xr-x. 2 yinjun yinjun 87 8月 2 16:24 test&#xff0c;如下图所示 前十位介绍 其中&#xff0c;0-9位为drwxr-xr-x&#xff0c;其说明情况如下 第0位确定文件类型&#xff0c;包括d&#xff0c;-&a…

Webots资源缓存文件包的使用方法

已经很久没有使用过Webots了&#xff0c;现在发现&#xff0c;资源包变成了在线加载&#xff0c;但是加载的实在太慢了&#xff0c;在官方github的release界面发现提供了离线包&#xff0c;以R2023b为例&#xff1a; 下载完后&#xff0c;将该压缩文件内的二进制缓存文件复制到…

与它更近一步,MySql怎么这么多的锁?

我们大多都知道行锁锁住的是一行数据&#xff0c;也知道怎么避免行锁造成的阻塞语句问题&#xff0c;但是还是有很多复杂情况&#xff0c;去加了很多锁&#xff0c;如间隙锁以及next-key lock&#xff0c;甚至他们的混合锁&#xff0c;如果这个不了解&#xff0c;搞不好就是语句…