函数调用过程

news2024/11/26 23:33:14

 生成机器码.o文件,使用objdump - d  -M intel  hello_func.o来看汇编代码

 

 栈内存由于历史原因看作是从高地址往低地址扩张所以栈底为高地址,栈顶为低地址。

rbp存储的时当前栈帧的基地址,栈底地址。

rsp存储的是栈顶地址,rip存储的是下一条指令的地址。

在main函数之前就存在start函数,所以在main函数之前就存在着栈帧。图中的栈帧为了方便显示地址用四个字节表示,每块内存占两字节。

rip永远指向下一条指令的地址。在压栈后rsp会下移2字节

pop:将rbp的值设置为 rbp所指向内存里的值,rsp退一格元素

leave:move  rsp   rbp(rsp的地址设置为rbp地址,就是将rsp和rbp值一致)

main函数栈帧进行的操作:

 main函数开始时进行操作:

1.push  rbp :将栈底指针压栈(rsp值 - 2字节)原因:rbp需要存储新的地址,记住上一个栈帧的基地址,后续需要恢复。

2.mov  rbp   rsp,将rsp的值赋值给rbp,此时rbp下移。rsp  rbp指向一起。

main函数进行的操作:

.......(暂不讨论)

main函数开始调用add函数时的操作:

3.call   64  <main+0x25>先将rip的地址压入栈中。后续add函数调用完回到main函数的下一条地址

等待add函数调用完成回到此位置再进行下面的操作

add函数栈帧进行的操作:

 add函数开始时进行操作:

1.push  rbp :将栈底指针压栈(rsp值 - 2字节)原因:rbp需要存储新的地址,记住上一个栈帧的基地址,后续需要恢复。

2.mov  rbp   rsp,将rsp的值赋值给rbp,此时rbp下移。rsp  rbp指向一起。

add函数执行时进行操作:

......

add函数调用mov进行操作:

3.call  32    <add+0x1d>先将rip的地址压入栈中(下一条指令的地址)。后续add函数调用完回到main函数的下一条地址

等待mov结束后返回到此位置继续其他操作

add函数结束时的操作

4.leave  ,leave操作相当于   mov  rsp   rbp,将rbp和rsp指到一起,再pop  rbp:将rbp的值设为rbp所指地址里的值,因为rbp指向的值,为上一次rbp的基地址,(这也就是为什么在函数开始时需要push  rbp)   ,然后rsp向上一格,rsp此时指向的main函数的栈顶地址。

5.将rip的值设为rsp指向的地址,此时指向的是main函数再调用时存储的下一条指令。

回到main函数的函数栈帧内

mov函数栈帧进行的操作:

 mov函数开始时进行操作:

1.push  rbp :将栈底指针压栈(rsp值 - 2字节)原因:rbp需要存储新的地址,记住上一个栈帧的基地址,后续需要恢复。

2.mov  rbp   rsp,将rsp的值赋值给rbp,此时rbp下移。rsp  rbp指向一起。

mov函数执行时进行操作:

......此时再进行其他压栈操作时,rsp的值不用向下移,此时rbp  rsp在同一位置,因为后续没有函数需要栈帧,这会导致在mov结束时不用进行leave操作。

mov函数结束时的操作!!!!!

3.pop  rbp  ,将rbp当前指向的值设为rbp的值,因为rbp指向的值为上一次rbp的栈底地址,这也是为何函数开始要push  rbp的原因。将rsp回退一格,回退后,rsp指向的是add函数的栈底。

4.ret  ,将rip的值设为rsp指向的地址,此时指向的是add函数再调用时存储的下一条指令。

执行完ret后程序返回到add函数的栈帧内。

 

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

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

相关文章

【计算机网络】TCP/IP——流量控制与拥塞控制

学习日期&#xff1a;2024.7.22 内容摘要&#xff1a;TCP的流量控制与拥塞控制 流量控制 一般来说&#xff0c;我们总是希望数据传输的快一些&#xff0c;但是如果数据传输的太快&#xff0c;接收方可能就来不及接收&#xff0c;这就会导致数据的丢失&#xff0c;流量控制正是…

【代码随想录】【算法训练营】【第58天 4】 [卡码104]建造最大岛屿

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 58&#xff0c;周四&#xff0c;ding~ 题目详情 [卡码104] 建造最大岛屿 题目描述 卡码104 建造最大岛屿 LeetCode类似题目827 最大人工岛 解题思路 前提&#xff1a; 思路&#xff1a; 重点…

压缩pdf大小的方法 指定大小软件且清晰

在数字化时代&#xff0c;pdf文件因其良好的兼容性和稳定性&#xff0c;已成为文档分享的主流格式。然而&#xff0c;高版本的pdf文件往往体积较大&#xff0c;传输和存储都相对困难。本文将为您详细介绍几种简单有效的方法&#xff0c;帮助您减小pdf文件的大小&#xff0c;让您…

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线 1、系统功能介绍2、演示视频3、系统框图4、系统电路介绍4.1、STM32单片机最小系统设计4.2、按键电路设计4.3、蜂鸣器报警电路设计4.4、Pulsesensor脉搏心率传感器模块电路设计 5、程序设计5.1、LCD TFT屏幕初始化5.2、TFT屏幕显…

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿(一)

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

《JavaSE》---21.<简单认识Java的集合框架包装类泛型>

目录 前言 一、什么是集合框架 1.1类和接口总览 二、集合框架的重要性 2.1 开发中的使用 2.2 笔试及面试题 三、背后所涉及的数据结构 3.1 什么是数据结构 3.2 容器背后对应的数据结构 四、包装类 4.1 基本数据类型和对应的包装类 4.2 装箱和拆箱 1.最初的写法 2.…

向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型

向量数据库的原理和实现&#xff0c;包括向量数据库的基本概念、相似性搜索算法、相似性测量算法、过滤算法和向量数据库的选型等等。向量数据库是崭新的领域&#xff0c;目前大部分向量数据库公司的估值乘着 AI 和 GPT 的东风从而飞速的增长&#xff0c;但是在实际的业务场景中…

NodeRed测试modbus RTU或modbus TCP通讯

目录标题 STEP1 添加modbus节点STEP2 查看是否安装成功STEP3 modbusTCP读取写入设置读取设置写入设置 STEP4 读写测试 STEP1 添加modbus节点 节点管理——控制板——安装 找到node-red-contrib-modbus&#xff0c;点击安装 STEP2 查看是否安装成功 安装成功后&#xff0c;左…

Day14 | 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

语言 Java 找树左下角的值 题目链接&#xff1a;找树左下角的值 题目 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路 本题有两种做法我主要讲一下递归的思路&#xff0c;创建两个全局变量&…

blender使用(三)常用建模操作及修改器

1&#xff0c;挤出图形 tab编辑模式&#xff0c;选中一个点/线/面&#xff0c;按键E&#xff0c;可以挤出对应的图形。选中点会挤出一条线&#xff0c;线会挤出一个面&#xff0c;面挤出体 2&#xff0c;倒角 选中一个边后&#xff0c;ctrlB &#xff0c;拖动鼠标是倒角范围&am…

MINIO集群部署手册

为了满足电子仓库功能相关部署与扩容等操作&#xff0c;因此提供电子仓库部署手册。手册中我们以2个minio节点&#xff0c;每个节点2个盘来进行分布式部署&#xff1b;并且最终扩容成4个节点每个节点2个盘。 操作系统 由于在Windows下运行分布式Minio处于实验阶段&#xff0c;因…

Web前端浅谈ArkTS组件开发

本文由JS老狗原创。 有幸参与本厂APP的鸿蒙化改造&#xff0c;学习了ArkTS以及IDE的相关知识&#xff0c;并有机会在ISSUE上与鸿蒙各路大佬交流&#xff0c;获益颇丰。 本篇文章将从一个Web前端的视角出发&#xff0c;浅谈ArkTS组件开发的基础问题&#xff0c;比如属性传递、插…

定积分与不定积分

定积分与不定积分 引言正文不定积分理解角度1理解角度2 定积分 引言 可能大家看到这个标题会不屑一顾&#xff0c;觉得这个还用你教我吗&#xff0c;高等数学最简单的内容。今天突然想到一个问题&#xff0c;就是为什么不定积分会有一个常数 C C C 出现&#xff0c;这个常数 …

继电器驱动电路的可靠性设计分析

在温度-30℃到85℃、供电电源9V-16V范围条件下&#xff0c;保证外部继电器能正常作动&#xff0c;且不发生负载能力降低的情况。&#xff08;注&#xff1a;需要详细的外部继电器规格说明&#xff09; 对于控制多路输出而且要求负载同时打开的模块&#xff0c;必须以50ms(10ms…

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言&#xff1a; 在C中有许多设计模式&#xff0c;单例模式就是其中的一种&#xff0c;该模式主要针对类而设计&#xff0c;确保在一个进程下该类只能实例化出一个对象&#xff0c;因此名为单例。而…

OpenCV 图像旋转和平移 数学和代码原理详解

文章目录 数学原理旋转矩阵平移和旋转合成变换矩阵应用在OpenCV中的实现 代码关键点解读完整代码C代码&#xff1a;Python代码&#xff1a; 在OpenCV中进行图像旋转涉及到一些基本的几何变换和图像处理操作。 数学原理 在图像旋转中&#xff0c;背后的数学原理主要涉及二维欧…

嵌入式硬件-Xilinx FPGA DDR4 接口配置基础(PG150)

1. 简介 1.1 DDR4 SDRAM 控制器主要特点 支持8到80位接口宽度的组件&#xff08;支持 RDIMM、LRDIMM、UDIMM 和 SODIMM&#xff09; 最大组件限制为9&#xff0c;此限制仅适用于组件&#xff0c;不适用于 DIMM。密度支持 最高支持 32 GB 的组件密度&#xff0c;64 GB 的 LRDI…

步步精慕尼黑上海电子展完美收官,感恩所有相遇,期待下次再会

2024年7月11日至13日&#xff0c;慕尼黑上海电子展圆满落幕&#xff0c;步步精科技&#xff08;以下简称步步精&#xff09;在此次展会上取得了丰硕的成果。作为连接器行业的重要制造商&#xff0c;步步精携带其最新产品和连接器技术方案亮相展会&#xff0c;吸引了大量参观者的…

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染&#xff0c;所谓条件渲染&#xff0c;即更具状态不同&#xff0c;选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …

RK3568笔记四十二:OLED 屏幕驱动(模拟I2C)

若该文为原创文章&#xff0c;转载请注明原文出处。 本篇记录使用GPIO模拟I2C驱动OLED屏幕&#xff0c;显示界面效果如下。 主要流程是&#xff0c;修改设备树&#xff0c;使用普通IO口&#xff0c;驱动模拟I2C方式&#xff0c;应用程直接传输数据控制。 1、修改设备 2、编写…