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寄存器的值。
在这里插入图片描述

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

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

相关文章

Charles的Map Remote功能

1、charles的Map Remote功能(指定的网络请求重定向到另一个网址),说白了就是你本来要请求A接口拿数据,重定向后,你实际请求的是B接口,拿到的是B接口返回的数据。 入口Tools->Map Remote 本次测试过程中…

第三节:在WORD为应用主窗口下关闭EXCEL的操作(2)

【分享成果,随喜正能量】凡事好坏,多半自作自受,既不是神为我们安排,也不是天意偏私袒护。业力之前,机会均等,毫无特殊例外;好坏与否,端看自己是否能应机把握,随缘得度。…

Trinitycore学习之在vscode查看远端服务器上源码配置

1:安装vscode,去官网下载,这里下载windows版本安装包 .zip https://code.visualstudio.com/Download 2:安装后,安装扩展chinese,使用中文设置,需要重启vscode。 3:安装ssh相关插件…

Springmvc之JSR303和拦截器

JSR303拦截器 1.JSR303 什么是JSR303 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的…

06目标检测-One-stage的目标检测算法

一、 One-stage目标检测算法 使用CNN卷积特征直接回归物体的类别概率和位置坐标值(无region proposal)准确度低,速度相对two-stage快 二、One-stage基本流程 输入图片------对图片进行深度特征的提取(主干神经网络&#…

苹果数据恢复软件:Omni Recover Mac

Omni Recover是一款十分实用的Mac数据恢复软件,为用户提供了简单、安全、快速和高效的数据恢复服务。如果您遇到了Mac或iOS设备中的数据丢失和误删情况,不要着急,不妨尝试一下Omni Recover,相信它一定会给您带来惊喜。 首先&…

CSS选择器

基本选择器 通配选择器 可以选中所有的HTML元素,清除样式时可以使用 * {color: orange;font-size: 40px; }元素选择器 为元素统一设置样式,故无法实现差异化设置 /* 为所有h1元素添加样式 */ h1 {color: red;font-size: 60px; }/* 为所有p元素添加样…

【C++ • STL • 力扣】详解string相关OJ

文章目录 1、仅仅翻转字母2、字符串中的第一个唯一字符3、字符串里最后一个单词的长度4、验证一个字符串是否是回文5、字符串相加总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价 ヾ(๑╹◡╹)ノ" 1、仅仅翻转字母 力扣链接 代码1展示&…

ENVI_IDL: 基础语法详解

01 题目 02 代码说明 题目本身很简单,但是我自己加了一些东西进去增加难度。主要包括print函数的封装、格式化字符串,但是不影响代码的阅读。(注:对于没有语言基础的人而言相对阅读困难,但是由于IDL是解释型语言&…

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮 效果图代码解析 效果图 代码解析 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons; import { useState, useEffect } from react; import { BASE_URL } from /utils/…

网络爬虫-----初识爬虫

目录 1. 什么是爬虫? 1.1 初识网络爬虫 1.1.1 百度新闻案例说明 1.1.2 网站排名(访问权重pv) 2. 爬虫的领域(为什么学习爬虫 ?) 2.1 数据的来源 2.2 爬虫等于黑客吗? 2.3 大数据和爬虫又有啥关系&…

stm32---基本定时器(TIM6,TIM7)

STM32F1的定时器非常多,由两个基本定时器(TIM6,TIM7)、4个通用定时器(TIM2-TIM5)和两个高级定时器(TIM1,TIM8)组成。基本定时器的功能最为简单&am…

〔022〕Stable Diffusion 之 生成视频 篇

✨ 目录 🎈 视频转换 / mov2mov🎈 视频转换前奏准备🎈 视频转换 mov2mov 使用🎈 视频转换 mov2mov 效果预览🎈 视频无限缩放 / Infinite Zoom🎈 视频无限缩放 Infinite Zoom 使用 🎈 视频转换 /…

ITIL 4—创建、交付和支持—设定工作优先级和管理供应商

5. 设定工作优先级和管理供应商 5.1 为什么我们要对工作优先级排序? 只要工作需求超出了在预期时间内能完成的产能,就会出现排队的情况。在理想情况下,组织的需求没有任何变化,并且拥有满足需求所需的适当质量和数量的资源。但现实里&…

Tomcat多实例部署和动静分离

一、多实例部署: 多实例:多实例就是在一台服务器上同时开启多个不同的服务端口,同时运行多个服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备: 1.关闭防火墙:systemctl …

Multi Query Attention Group Query Attention

Multi Query Attention(MQA)在2019年就被提出来了,用于推理加速,但在当时并没有受到很多关注,毕竟一张2080就能跑Bert-base了。随着LLM的大火,MQA所带来的收益得以放大。 思路 Multi Query Attention(MQA)跟Multi Head Attention…

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

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

自动驾驶汽车下匝道路径优化控制策略研究

摘要 随着社会不断进步, 经济快速发展, 科学技术也在突飞猛进, 交通行业是典型的领域之一。现阶段的交通发展W 实现智能交通系统为目标, 正逐渐从信息化步入智能化,朝着智慧化迈进。近年来,一系…

DeepinV20/Ubuntu安装postgresql方法

首先,建议看一下官方的安装文档PostgreSQL: Linux downloads (Ubuntu) PostgreSQL Apt Repository 简单的说,就是Ubuntu下的Apt仓库,可以用来安装任何支持版本的PgSQL。 If the version included in your version of Ubuntu is not the one…

MYBATIS-PLUS入门使用、踩坑记录

转载&#xff1a; mybatis-plus入门使用、踩坑记录 - 灰信网&#xff08;软件开发博客聚合&#xff09; 首先引入MYBATIS-PLUS依赖&#xff1a; SPRING BOOT项目&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus…