X86_64函数调用汇编程序分(2)
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寄存器的值。
相关文章:

X86_64函数调用汇编程序分(2)
X86_64函数调用汇编程序分(2) 1 X86_64寄存器使用标准2 leaveq和retq指令2.1 leaveq2.2 retq 3 执行leaveq和retq之后栈的结构3.1 执行leaveq之后栈的结构3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图3.1.2 test_fun_b函数执行leaveq之后的栈结构示…...

组件传值之ref(解决父传子动态绑定问题)
在父组件往子组件传值,子组件中要显示父组件的信息,首先是在网上搜的watch 来监听组组件的props,但是父组件只传一次,后续再更改就没了,所以我用的$refs props:{params:{type:Object;defult():{return {} } } }watch:{params: {/…...

vscode-server
1know_host清除 2 删除服务器里的home/user/.vscode-server(不是根root下的vscode-server),删除时用户名保持一致。 3 ssh配置文件 /etc/ssh/sshd_config[想改变,使用root,修改文件权限] 4 删除修改后,重启Windows下…...

ubuntu 20.04安装开发环境总结_安装python
Ubuntu 20.04 是一款主要面向开发人员的操作系统之一,与此同时,它还支持多种开发环境和工具的使用。但是因为对市面上各种软件的支持没有window那样友好,所以对ubuntu系统安装配置各种环境的问题做了个总结 安装 PyCharm: 可以从…...

尚硅谷_宋红康_IntelliJ IDEA 常用快捷键一览表
1-IDEA的日常快捷键 第1组:通用型 说明快捷键复制代码-copyctrl c粘贴-pastectrl v剪切-cutctrl x撤销-undoctrl z反撤销-redoctrl shift z保存-save allctrl s全选-select allctrl a 第2组:提高编写速度(上) 说明快捷…...

Java设计模式之建造者模式详解(Builder Pattern)
在日常的开发工作中,我们常常需要创建一些复杂的对象。这些对象可能包含许多不同的属性,并且这些属性的初始化过程可能相当复杂。在这种情况下,建造者模式是一种非常有用的设计模式,因为它允许我们分步骤地创建复杂的对象。 概念和…...

TCP的滑动窗口与拥塞控制
客户端每发送的一个包,服务器端都应该有个回复,如果服务器端超过一定的时间没有回复,客户端就会重新发送这个包,直到有回复。 为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什…...

MySQL更新语句执行过程
执行流程 update t set name XXX where id 1; 加载id1的记录所在的整页数据到缓存池;旧值写入undolog便于回滚;更新内存数据;写redo log到RedoBuff;redo log顺序写入磁盘,准备提交事务(prepare阶段&…...

Matlab图像处理-彩色图像基础
彩色的物理认识 人类能够感知的物体的颜色是由物体反射的光的性质决定的。如图8-2所示,可见光是由电磁波谱中较窄的波段组成。 如果物体反射的光在所有可见光波长范围内都是平衡的,那么从观察者的角度来看,它是白色的; 如果物体…...

MATLAB算法实战应用案例精讲-【数模应用】数据中台
目录 前言 几个高频面试题目 数据中台、数仓、大数据平台的区别 1)数据中台VS数据仓库...

el-form动态检验无法生效问题(已解决)
要对el-form里面的字段动态生成校验规则,测试了一系列的骚操作也无法生效,要么是require视图生效了,校验规则还是不生效;看了csdn里面好多方案,都是废话,废话,直接上硬货,最终总结如下ÿ…...

【python】代码学习过程问题总结
目录 1. 使用 conda 创建并进入虚拟环境 2. pycharm 选择 interpreter 的时候,在虚拟环境中找不到 python.exe 3.(py & python)ModuleNotFoundError: No module named XXX 4. AttributeError: module ‘tensorflow‘ has no attribu…...

Qt应用开发(基础篇)——菜单 QMenu
一、前言 QMenu类继承于QWidget,它提供了一个菜单样式的小部件,用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的,它可以是一个下拉的菜单,也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…...

MySQL-DDL语句
MySQL-DDL语句 数据库操作语句增删数据库查看数据库列表创建数据库进入(使用)数据库/查看当前所在的数据库查看数据库的建库语句查看数据库的编码集和校验集删除数据库修改数据库的编码集查看数据库支持的编码集和校验集 数据库备份备份单个数据库恢复数…...

总结987
考研倒计时102天 时间记录: 6:20起床 7:00~7:40早读,13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾,记录 11:20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …...

【服务器 | 测试】如何在centos 7上面安装jmeter
安装之前需要几个环境,以下是列出的几个环境 CentOS 7.7 64位JDK 1.8JMeter 5.2 1. 下载jmeter安装包 JMeter是开源的工具,安装 JMeter 要先安装好 JDK 的环境,安装JDK在前面的文章已经讲到 JMeter最新版下载地址:Apache JMeter…...

20.04部署cartographer
部署cartographer sudo apt-get update sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow下载cartographer新建了一个ws mkdir carto_ws cd carto_ws wstool init src wstool merge -t src https://raw.githubusercontent.com/cartographer-project/…...

djangoMTV初探
1.restful请求方式 一个视图对应多个操作(增删改查) 老的方式 views.py from django.shortcuts import render from django.http import HttpResponse,request,QueryDict, JsonResponse from myapp.models import User from django.views.generi…...

Minecraft--基于云服务器搭建自己的服务器--简易搭建
阿丹: 上一个项目结束了。但是看着自己的服务器想着能不能做点啥子吧。想到了之前和兄弟们玩的麦块。好久没和兄弟们一起玩耍了。怀念之前一起连一个wifi玩我的世界的时候是真快乐。于是尝试自己动手搭建一个我的世界服务器,邀请兄弟们重温一下快乐。 提…...

【数据结构与算法】十大经典排序算法
文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…...

Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(一)
1.前言 在12.0的系统定制化开发中,由于从12.0开始SystemUI下拉状态栏和11.0的变化比较大,所以可以说需要从新分析相关的SystemUI的 布局,然后做分析来实现不同的功能,今天就开始实现关于隐藏SystemUI下拉状态栏中的通知栏布局系列一 如图: 2.SystemUI下拉状态栏定制化之…...

665. 非递减数列-先改后验法
665. 非递减数列 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 < i < n-2),总满足 nums[i] < …...

调教 文心一言 生成 AI绘画 提示词(Midjourney)
文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好,今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具,能…...

半导体制造工艺(一)光刻
在这里开个新专题,主要详细描述半导体制造整个流程中所用到的设备工艺步骤。 在集成电路制造工艺中,光刻是决定集成器件集成度的核心工序,该工序的作用是将图形信息从掩模版(也称掩膜版)上保真传输、转印到半导体材料衬…...

【海思SS626 | 开发环境】VMware17安装Ubuntu 18.04.6
目录 一、下载 Ubuntu 18.04.6 LTS二、VMware17创建虚拟机三、安装Ubuntu18.04LTS四、安装其他软件五、总结 一、下载 Ubuntu 18.04.6 LTS 问题:为什么要下载 Ubuntu18.04.6 LTS 而不是使用最新的,或者其他Linux发行版? 答:在ss6…...

Vue知识系列(3)每天10个小知识点
目录 系列文章目录Vue知识系列(1)每天10个小知识点Vue知识系列(2)每天10个小知识点 知识点**21. Vue不同生命周期**的概念、作用、原理、特性、优点、缺点、区别、使用场景**22. Vue 子组件和父组件执行顺序****23. created 和 mo…...

Java基础入门·多线程·线程池ThreadPool篇
前言 特点分析 线程池ThreadPool 销毁线程池 Executor类 Callable接口 线程池使用 …...

Trinitycore学习之在vscode查看远端服务器上源码配置
1:安装vscode,去官网下载,这里下载windows版本安装包 .zip https://code.visualstudio.com/Download 2:安装后,安装扩展chinese,使用中文设置,需要重启vscode。 3:安装ssh相关插件…...

583. 两个字符串的删除操作 -- 动规
583. 两个字符串的删除操作 class MinDistance:"""583. 两个字符串的删除操作https://leetcode.cn/problems/delete-operation-for-two-strings/description/"""def solution(self, text1: str, text2: str) -> int:"""这道题…...

SOME/IP
介绍 SOME/IP是一种汽车中间件解决方案,可用于控制消息。它从一开始就被设计为完美地适应不同尺寸和不同操作系统的设备。这包括小型设备,如相机、AUTOSAR 设备,以及头戴设备或远程通信设备。它还确保SOME/IP支持信息娱乐域以及车辆中其他域…...