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、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…...
Pega Helm Charts:Kubernetes上自动化部署Pega平台的完整指南
1. 项目概述与核心价值如果你正在或即将在Kubernetes上部署Pega Platform,那么pegasystems/pega-helm-charts这个项目绝对是你绕不开的“官方说明书”和“自动化工具箱”。简单来说,这是Pega官方维护的一套Helm Chart,专门用于将Pega Platfor…...
Cursor Pro免费升级完整指南:3分钟突破使用限制的实用教程
Cursor Pro免费升级完整指南:3分钟突破使用限制的实用教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…...
Encounter/Innovus GIFT TCL 脚本流程索引清单
目录 一、 布局阶段 (Placement) 二、 布线阶段 (Routing) 三、 时序阶段 (Timing) 四、 电源阶段 (Power) 五、 IO 与端口处理 六、 调试与辅助工具 一、 布局阶段 (Placement) 脚本名称 核心用途 调用场景 userAddAllHInsts.tcl 为源模块中的每个扇出添加缓冲器 解决高扇…...
AI智能体通过MCP协议连接Figma:实现设计稿自动化操作与代码生成
1. 项目概述:当AI智能体学会“看”设计稿最近在折腾一个挺有意思的东西:让AI智能体(比如Cursor、Claude Code)能直接和Figma对话。听起来有点科幻?其实原理不复杂,就是通过一个叫Model Context Protocol&am…...
新媒体编辑提效:OpenClaw批量剪辑短视频、生成文案字幕,适配多平台发布规则
新媒体编辑效率革命:OpenClaw赋能短视频批量剪辑、智能文案生成与多平台适配在信息爆炸、注意力稀缺的移动互联网时代,短视频已成为内容传播的绝对主力军。对于新媒体运营团队而言,高效地产出高质量、符合各平台调性且能快速发布的短视频内容…...
终极网盘直链下载助手完整指南:告别限速,快速获取八大平台真实下载地址
终极网盘直链下载助手完整指南:告别限速,快速获取八大平台真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里…...
别再想当然!用AD628/INA等差分放大器做单端采集,必须搞懂的共模电压计算(附Excel工具)
差分放大器单端采集实战指南:共模电压计算与设计避坑 在工业传感器接口和医疗设备信号链设计中,差分放大器常被用于单端信号采集的场景。许多工程师习惯性地认为,只要将差分放大器的负输入端接地,就能轻松实现单端转差分功能。但实…...
智能家居安全新突破:视觉AI如何实现从感知到认知的跨越
1. 项目概述:当视觉智能成为家庭安全的“火眼金睛”最近几年,智能家居的概念越来越火,从智能门锁到语音助手,似乎家里的一切都在变得“聪明”。但说实话,很多所谓的“智能”安全方案,比如单纯依靠门窗传感器…...
PHP反序列化漏洞实战:从CTFshow F5杯‘eazy-unserialize’两道题,到文件包含与协议利用的完整避坑指南
PHP反序列化漏洞实战:从CTF题目到真实漏洞利用的深度解析 在CTF竞赛中,PHP反序列化漏洞一直是Web安全方向的热门考点。这类漏洞不仅考验选手对PHP语言特性的理解,更要求具备将多个知识点串联运用的能力。本文将以一道典型CTF题目为例…...
终极指南:如何使用Cherry MX键帽3D模型库打造你的专属机械键盘
终极指南:如何使用Cherry MX键帽3D模型库打造你的专属机械键盘 【免费下载链接】cherry-mx-keycaps 3D models of Chery MX keycaps 项目地址: https://gitcode.com/gh_mirrors/ch/cherry-mx-keycaps 想要打造一把真正属于自己的机械键盘吗?厌倦了…...
