X86_64函数调用汇编程序分(2)

news2024/11/26 23:45:32

X86_64函数调用汇编程序分(2)

  • 1 X86_64寄存器使用标准
  • 2 leaveq和retq指令
    • 2.1 leaveq
    • 2.2 retq
  • 3 执行leaveq和retq之后栈的结构
    • 3.1 执行leaveq之后栈的结构
      • 3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图
      • 3.1.2 test_fun_b函数执行leaveq之后的栈结构示意图
    • 3.2 执行retq之后栈的结构
      • 3.2.1 test_fun_b函数执行retq之前的栈结构示意图
      • 3.2.2 test_fun_b函数执行retq之后的栈结构示意图

X86_64函数调用汇编程序分析

1 X86_64寄存器使用标准

  • %rdi, %rsi, %rdx, %rcx, %r8, %r9分别用于函数调用过程中的前6个参数,对于6的参数存放在栈中传递
  • %rsp用做栈指针寄存器,指向栈顶
  • %rbp用作栈框寄存器,指向栈底
  • %rax用做函数返回值的第一个寄存器
  • %rip寄存器可以当做PC寄存器(程序计数器)使用。它用于存储下一条要执行的指令的地址。[ In 64-bit mode, the RIP register becomes the instruction pointer. This register holds the 64-bit offset of the next instruction to be executed. 64-bit mode also supports a technique called RIP-relative addressing. Using this technique, the effective address is determined by adding a displacement to the RIP of the next instruction.(在 64 位模式下,RIP 寄存器成为指令指针。该寄存器保存下一条要执行指令的 64 位偏移量。64 位模式还支持一种称为 RIP 相对寻址的技术。使用这种技术,有效地址是通过在下一条指令的 RIP 中加入一个位移来确定的。) ]
    在这里插入图片描述

2 leaveq和retq指令

2.1 leaveq

x86_64架构的leaveq指令是一个伪指令,它并不是一条单独的指令,而是由两条实际指令组合而成的。具体来说,leaveq的功能等效于pop %rbp; mov %rbp, %rsp这两条指令。

首先,让我们来了解一下这两条指令的含义:

mov %rbp, %rsp:这条指令将栈指针寄存器%rbp的值复制到基指针寄存器%rsp中。在x86_64架构中,%rsp寄存器用于保存当前线程的栈指针,指向栈顶位置。而%rbp寄存器通常用作基指针,指向函数调用堆栈的底部。
pop %rbp:这条指令弹出栈顶的值并将其存储在%rbp寄存器中。在函数调用过程中,%rbp寄存器的值通常被保存起来,用于在函数返回时恢复函数调用堆栈的状态。
那么,为什么需要这两条指令的组合呢?在x86_64架构中,当函数调用发生时,处理器会将函数的参数和局部变量压入栈中,同时保存一些寄存器的值(如%rbp)以供函数内部使用。当函数执行完毕并准备返回时,需要恢复这些寄存器的值并清理栈中的局部变量。这就是leaveq伪指令的作用。

通过执行mov %rbp, %rsp和pop %rbp这两条指令,可以将栈指针的值复制到%rbp寄存器中,并弹出栈顶的值恢复%rbp寄存器的原始值。这样,函数返回后,栈指针和基指针的值都得到了恢复,保证了程序的正确执行。

需要注意的是,leaveq伪指令的执行并不会改变任何寄存器的值,只会影响栈指针和基指针的状态。因此,它通常用于函数返回之前的准备阶段,以确保正确的控制流和栈状态。

总结一下,x86_64架构的leaveq伪指令是一个用于恢复函数调用堆栈状态的指令组合,它等效于mov %rbp, %rsp; pop %rbp这两条实际指令的功能。在执行leaveq后,栈指针和基指针的值会得到恢复,为函数返回做好准备。

2.2 retq

x86_64架构中的retq指令是用于从当前函数调用中返回的指令。在函数调用完成后,retq指令会将控制权返回给调用者,同时恢复堆栈状态和寄存器的值。

首先,让我们来了解一下retq指令的作用。当函数执行到retq指令时,处理器会从当前函数调用的堆栈中弹出返回地址,并将控制流转移到该地址处。这个地址通常是在函数调用时被压入栈中的。因此,在函数返回时,控制权会返回到调用该函数的地方。

在执行retq指令时,处理器还会恢复一些寄存器的值。例如,在函数调用发生时,基指针寄存器%rbp的值通常会被保存起来,用于在函数返回时恢复堆栈的状态。同样地,栈指针寄存器%rsp的值也可能会被保存和恢复。这些操作是隐式的,不需要程序员显式地编写指令来完成。

另外,关于retq指令的执行时机,它通常出现在函数的末尾,即当函数的所有操作都完成后才会执行。在某些情况下,如果函数使用了递归或者其他更复杂的控制流程,可能会在更早的时候使用retq指令来提前返回。但是,在函数执行完毕之前使用retq指令是不允许的,否则会导致程序崩溃或其他错误。

需要注意的是,如果使用汇编语言来编写程序,通常需要根据具体的架构和编译器来编写代码。虽然x86_64架构中的retq指令可以用来实现函数返回的操作,但是使用汇编语言编写程序需要考虑到很多细节和注意事项,包括对寄存器的使用、内存访问以及其他底层操作的处理。因此,除非必要,否则建议尽可能使用高级语言来编写程序,以避免出现一些难以预料的问题。

总之,x86_64架构中的retq指令是用于从当前函数调用中返回的指令。它通过弹出堆栈中的返回地址并将控制流转移到该地址来实现函数返回的操作。同时,一些寄存器的值也会得到恢复,以确保程序在返回之前处于正确的状态。

3 执行leaveq和retq之后栈的结构

3.1 执行leaveq之后栈的结构

3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图

在这里插入图片描述

3.1.2 test_fun_b函数执行leaveq之后的栈结构示意图

在test_fun_b调用leaveq之后,test_fun_b的栈空间就会被释放掉,该指令执行的操作为:

pop %rbp
mov %rbp, %rsp;

在这里插入图片描述

3.2 执行retq之后栈的结构

通常情况下,leaveq和retq是依次被调用到的。leaveq是为了恢复%rsp寄存器的值,而ret会把返回地址从栈中弹出并将%rip指向弹出的返回地址。

3.2.1 test_fun_b函数执行retq之前的栈结构示意图

在这里插入图片描述

3.2.2 test_fun_b函数执行retq之后的栈结构示意图

retq会把返回地址从栈从弹出,并更新%rip寄存器的值为返回地址的值,同时也会更新%rsp寄存器的值。
在这里插入图片描述

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

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

相关文章

MySQL使用Xtrabackup备份到AWS存储桶

1.安装Xtrabackup cd /tmp wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86…

Markdown 字体变红色,2种办法

老读者都知道王哥是 10 年 markdown 专家&#xff0c;今天教大家如何搞定字体颜色通用技巧 文章目录 方案一效果 方案二效果 颜色参考表 方案一 HEML 代码&#xff1a; <font colorred> 学技术&#xff0c;到 JavaPub </font>或者 <font colorFF0000> 学技术…

OpenCV之图片修复(inpaint)

图片修复基本原理&#xff1a; 我们自己标定噪声的特征&#xff0c;然后根据噪声周围区域的颜色特征修复噪声所在的区域。通俗一点就是用邻近的像素替换那些坏标记&#xff0c;使其看起来像是邻居。 如下图&#xff0c;需要将白色框框去掉&#xff1a; 标定噪声特征 先分析白…

记一次在amd架构打包arm64架构的镜像的试错经历

前提 在amd架构打包了一个镜像&#xff0c;放在arm64架构服务器上可以load ,但是run的时候报平台不兼容的问题。 运行如下命令查看发现 架构属于 amd64 如下&#xff1a; docker inspect 镜像ID需要生成一个arm的镜像才能运行。 尝试 首先Dockerfile 的FROM 基础镜像就的是…

uniapp 接入微信小程序隐私政策兼容

自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后&#xff0c;方可调用微信提供的隐私接口。 相关公告见&#xff1a;关于小程序隐私保…

Sharding-JDBC分库分表-分布式事务-5

分布式事务 Sharding JDBC事务介绍 分库分表必然会涉及到分布式事务的问题&#xff0c;关于这方面&#xff0c;sharding JDBC为用户提供了两种分布式事务解决方案&#xff1a;XA事务和BASE事务&#xff0c;这两个的区别是&#xff1a;XA事务&#xff0c;追求强一致性&#xf…

udev自动创建设备节点的机制

流程框图如下 自动创建 1 内核检测到设备插入后&#xff0c;会发送一个uevent事件到内核中&#xff0c;并提供有关硬件设备的信息。 2 udevd守护程序收到uevent事件后&#xff0c;创建一个设备类&#xff0c;&#xff08;向上提交目录信息&#xff09;&#xff0c;会在内核中…

道路交通资产管理体系实施指南

声明 本文是学习GB-T 42932-2023 道路交通资产管理体系实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 7 支持 7.1 资源 组织宜确定并提供建立、实施、保持和持续改进资产管理体系所需的资源&#xff0c;包括人力、财力、物质、技 术、知…

Java8实战-总结26

Java8实战-总结26 用流收集数据分组多级分组按子组收集数据 用流收集数据 分组 一个常见的数据库操作是根据一个或多个属性对集合中的项目进行分组。就像前面讲到按货币对交易进行分组的例子一样&#xff0c;如果用指令式风格来实现的话&#xff0c;这个操作可能会很麻烦、啰…

ABB PP846 3BSE042238R1触摸屏模块

ABB PP846 3BSE042238R1是一款触摸屏模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;以提供人机界面&#xff08;HMI&#xff09;功能&#xff0c;允许操作员与控制系统进行交互和监控。以下是一些可能的产品功能和功能&#xff0c;但请注意&#xff0c;具体的功能…

win10一进桌面就全部黑屏了 win10开机黑屏怎么办

在使用Windows 10的过程中&#xff0c;我们会遇到许多问题&#xff0c;但它们都不会像黑屏那样烦人&#xff0c;因为黑屏时不会收到任何错误代码或消息&#xff0c;提示我们从何处开始进行故障排除。 在Windows 10操作系统中&#xff0c;出现黑屏可能有多种原因&#xff0c;它…

性能测试度量指标

1-响应时间 响应时间指从用户或事务在客户端发起一个请求开始&#xff0c;到客户端接收到从服务器端返回的响应结束&#xff0c;这整个过程所消耗的时间 在性能测试实践中&#xff0c;为了使响应时间更具代表性&#xff0c;响应时间通常是指事务的平均响应时间ART 在实践中要…

力扣刷题-移除指定值的链表元素

力扣203移除元素 题目来源&#xff1a; 力扣203 题目描述&#xff1a; 非常简单的一道题&#xff0c;主要强调两点 链表删除要记录删除位置的前驱节点 头节点没有前驱 因此直接headhead.next为了保持与后两种一致&#xff0c;加上虚拟节点&#xff0c;下一节点指向头节点 /***…

Java 复习笔记 -学生管理系统进阶篇

文章目录 学生管理系统进阶版一&#xff0c;需求部分&#xff08;一&#xff09;需求&#xff08;二&#xff09;分析1&#xff0c;登录界面2&#xff0c;用户类3&#xff0c;注册功能4&#xff0c;登录功能5&#xff0c;忘记密码6&#xff0c;验证码规则 二&#xff0c;实现部…

【具身智能】RT-2:视觉-语言-动作模型(VLA)

文章目录 前言一、视觉-语言-动作(VLA)模型二、利用 VLM 控制机器人三、实验四、 Demo五、总结前言 Robotic Transformer 2(RT-2)是由谷歌 DeepMind 新推出的大语言模型,它为人类提供了通过纯语言命令来优化机器人控制的能力。与此前的大模型不同,RT-2是一种新型的视觉-…

使用C语言EasyX 创建动态爱心背景

简介 在计算机图形学的世界中&#xff0c;有很多方法可以使程序的界面更加吸引人。在本篇博客中&#xff0c;我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果&#xff0c;它还包括背景的星星、旋转的心形以及一个美观的背景渐…

Scrapy爬虫框架实战

Python实现爬虫是很容易的&#xff0c;一般来说就是获取目标网站的页面&#xff0c;对目标页面的分析、解析、识别&#xff0c;提取有用的信息&#xff0c;然后该入库的入库&#xff0c;该下载的下载。以前写过一篇文章《Python爬虫获取电子书资源实战》&#xff0c;以一个电子…

Vite+React+Electron开发入门,10分钟搭建本地环境并打包

前言 想使用vite和react开发跨平台桌面的软件方案有electron和tauri两种&#xff0c;但是我个人更喜欢tauri&#xff0c;无奈electron名声大燥&#xff0c;面试要求里很多都写着&#xff1a;electron...可见这类公司多么落后。但是呢&#xff0c;又秉持着存在即合理的理念&…

Android 12 源码分析 —— 应用层 五(SystemUI的StatusBar类的启动过程和三个窗口的创建)

Android 12 源码分析 —— 应用层 五&#xff08;SystemUI的StatusBar类的启动过程和三个窗口的创建&#xff09; 在前面的文章中&#xff0c;我们介绍了SystemUI App的基本布局和基本概念。接下来&#xff0c;我们进入SystemUI应用的各个UI是如何被加入屏幕的。那么我们就先从…

计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)

图像分类 教程博客_传送门链接:链接 在本教程中&#xff0c;您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型&#xff0c;耐心看完&#xff0c;相信会有很大收获。废话不…