X86汇编速成

平时用的电脑都是X86的,但是现在大家都在搞RISC-V,计组也都开始以RISC-V作为示例,所以专门回头来补一下X86的汇编,方便平时使用。

寄存器register

请添加图片描述
X86_64中一共有16个64位的通用寄存器,分别为:

  • RAX, RBX, RCX,RDX, RBP, RSI,RDI, RSP, R8–R15
    • RAX用来存储函数返回值,
    • RSP用来作为堆栈指针寄存器,RSP增大入站,减小出栈。
    • RBP,栈帧指针,标识当前栈帧的起始位置。
    • 其余的随便用
      Callee save表示当出现函数调用的时候,这些通用寄存器内的值由被调用者保存,即在进入被调用函数后由被调用函数存储到它的栈里面,并在返回前还原回去,与之对应的,Caller save则表示由调用者存储,在进入调用函数前就要自己提前push到自己的栈里面

32位的X86中只有8个通用寄存器,没有R8-R15

栈stack

请添加图片描述

指令

指令有两种形式,一种是AT&T的,一种是Intel的,我们用Intel风格的

opcode arg1,agr2

这是一段代码:

int add(int a, int b){return a+b;
}
int main(){int a = 1;int b = 2;int c = add(a,b);return c-a-b;
}

下面是使用gcc编译得到的汇编代码

.file   "test_asm.c".text.globl  add.type   add, @function
add:
.LFB0:.cfi_startprocendbr64pushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6movl    %edi, -4(%rbp)movl    %esi, -8(%rbp)movl    -4(%rbp), %edxmovl    -8(%rbp), %eaxaddl    %edx, %eaxpopq    %rbp.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size   add, .-add.globl  main.type   main, @function
main:
.LFB1:.cfi_startprocendbr64pushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6subq    $16, %rspmovl    $1, -12(%rbp)movl    $2, -8(%rbp)movl    -8(%rbp), %edxmovl    -12(%rbp), %eaxmovl    %edx, %esimovl    %eax, %edicall    addmovl    %eax, -4(%rbp)movl    -4(%rbp), %eaxsubl    -12(%rbp), %eaxsubl    -8(%rbp), %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE1:.size   main, .-main.ident  "GCC: (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0".section        .note.GNU-stack,"",@progbits.section        .note.gnu.property,"a".align 8.long    1f - 0f.long    4f - 1f.long    5
0:.string  "GNU"
1:.align 8.long    0xc0000002.long    3f - 2f
2:.long    0x3
3:.align 8
4:

下面是在X86_64下使用objdump得到的反汇编指令代码

test_asm.o:     file format elf64-x86-64Disassembly of section .text:0000000000000000 <add>:0:   f3 0f 1e fa             endbr64               ; 引入指令序列断点,并启用64位模式4:   55                      push   %rbp           ; 保存调用者的栈帧指针到栈中,如上文提到的Callee save5:   48 89 e5                mov    %rsp,%rbp       ; 设置当前栈帧指针为栈顶指针8:   89 7d fc                mov    %edi,-0x4(%rbp) ; 将第一个参数存储到相对于栈帧指针偏移为-4的位置b:   89 75 f8                mov    %esi,-0x8(%rbp) ; 将第二个参数存储到相对于栈帧指针偏移为-8的位置e:   8b 55 fc                mov    -0x4(%rbp),%edx ; 将第一个参数加载到寄存器edx中11:   8b 45 f8                mov    -0x8(%rbp),%eax ; 将第二个参数加载到寄存器eax中14:   01 d0                   add    %edx,%eax       ; 执行加法操作,将edx和eax的值相加,结果存储在eax中16:   5d                      pop    %rbp            ; 恢复调用者的栈帧指针17:   c3                      retq                   ; 返回至调用者0000000000000018 <main>:18:   f3 0f 1e fa             endbr64               ; 引入指令序列断点,并启用64位模式1c:   55                      push   %rbp           ; 保存调用者的栈帧指针到栈中1d:   48 89 e5                mov    %rsp,%rbp       ; 设置当前栈帧指针为栈顶指针20:   48 83 ec 10             sub    $0x10,%rsp     ; 为局部变量分配16字节的栈空间24:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%rbp) ; 将值1存储到相对于栈帧指针偏移为-12的位置2b:   c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%rbp) ; 将值2存储到相对于栈帧指针偏移为-8的位置32:   8b 55 f8                mov    -0x8(%rbp),%edx ; 将第二个参数加载到寄存器edx中35:   8b 45 f4                mov    -0xc(%rbp),%eax ; 将第一个参数加载到寄存器eax中38:   89 d6                   mov    %edx,%esi       ; 将edx的值复制给esi寄存器,用作add函数的第二个参数3a:   89 c7                   mov    %eax,%edi       ; 将eax的值复制给edi寄存器,用作add函数的第一个参数3c:   e8 00 00 00 00          callq  41 <main+0x29>  ; 调用add函数41:   89 45 fc                mov    %eax,-0x4(%rbp) ; 将add函数返回值存储到相对于栈帧指针偏移为-4的位置44:   8b 45 fc                mov    -0x4(%rbp),%eax ; 将add函数返回值加载到寄存器eax中47:   2b 45 f4                sub    -0xc(%rbp),%eax ; 执行减法操作,将eax的值减去第一个参数的值4a:   2b 45 f8                sub    -0x8(%rbp),%eax ; 执行减法操作,将eax的值减去第二个参数的值4d:   c9                      leaveq                 ; 恢复栈帧并将栈顶指针设置为栈帧指针4e:   c3                      retq                   ; 返回至调用者

也确实是像大家说的,X86的手册太太太长了,X86为了向32位兼容,搞出来的很多机制令人头大

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

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

相关文章

微信小程序开发——实现跳转公众号文章

小程序中要显示公众号的文章&#xff0c;该怎么做? 比如&#xff0c;下面的文章地址&#xff1a; 第一款小程序欢迎体验小程序&#xff0c;如有好的想法和建议请留言&#xff0c;不胜感激&#xff01;https://mp.weixin.qq.com/s?__bizMzI2MjQ4Mzg0NA&mid2247483669&…

ThinkPhp8 框架使用 mysql find_in_set 函数

前言: 使用mysql 存储一些标签时 会使用逗号拼接的存储方法 比如 1,2,3,11 一般情况下 查询 1 可能会用到 like %1% 但这样查询的不够准确 因为11也会被查询到 如果每次都多一个逗号 1,2,3,11, 查询时 like %1,% 这样存储有点不太符合程序设计 解决方案 ----------- 官网…

Go协程池gopool源码解析

1、gopool简介 Repository&#xff1a;https://github.com/bytedance/gopkg/tree/develop/util/gopool gopool is a high-performance goroutine pool which aims to reuse goroutines and limit the number of goroutines. It is an alternative to the go keyword. gopool的…

基于Difussion图像、视频生成综述

2024年大年初七&#xff08;02.16&#xff09;OpenAI 发布视频生成模型 Sora 在各大平台转疯了&#xff0c;和2022年发布ChatGPT3.5时一样的疯狂。在开工第一天&#xff0c;我就去官网上看了 Sora 的技术报告&#xff0c;遗憾的是&#xff0c;在这份技术报告中只披露了一些模型…

memcached集群

一、介绍 memcache本身没有像redis所具备的数据持久化功能&#xff0c;但是可以通过做集群同步的方式&#xff0c;让各memcache服务器的数据进行同步&#xff0c;从而实现数据的一致性&#xff0c;即保证各memcache的数据是一样的&#xff0c;即使有任何一台memcache发生故障&…

2024-04-07 作业

作业要求&#xff1a; 1> 思维导图 2> 自由发挥应用场景实现一个登录窗口界面。 【可以是QQ登录界面、也可以是自己发挥的登录界面】 要求&#xff1a;尽量每行代码都有注释 作业1&#xff1a; 作业2&#xff1a; 运行代码&#xff1a; #include "myqwidget.h&quo…

提高网站安全性,漏洞扫描能带来什么帮助

随着互联网的蓬勃发展&#xff0c;网站已经成为人们获取信息、交流思想、开展业务的重要平台。然而&#xff0c;与之伴随的是日益严重的网络安全问题&#xff0c;包括恶意攻击、数据泄露、隐私侵犯等。 为了保障网站的安全性&#xff0c;提前做好网站的安全检测非常有必要&…

Spring学习笔记:IOC控制反转、AOP面向切面

挺快的&#xff0c;框架这一部分 文章目录 一、Spring概述入门案例导入依赖包在src下写配置文件创建普通类和测试类 二、IOC&#xff08;控制反转&#xff09;2.1 IOC bean 的XML操作&#xff08;创建对象&#xff0c;注入属性2.2 IOC bean 的 注解 操作 三、AOP&#xff08;面…

「每日跟读」英语常用句型公式 第6篇

「每日跟读」英语常用句型公式 第6篇 1. As ___ as possible 越 ___ 越好 As soon as possible (ASAP)(越快越好) As happy as possible (越快乐越好) As prepared as possible (越有准备越好) As much/many as possible (越多越好 *不可数/可数) As early as possible …

STM32一个地址未对齐引起的 HardFault 异常

1. 概述 客户在使用 STM32G070 的时候&#xff0c;KEIL MDK 为编译工具&#xff0c;当编译优化选项设置为Level0 的时候&#xff0c;程序会出现 Hard Fault 异常&#xff0c;而当编译优化选项设置为 Level1 的时候&#xff0c;则程序运行正常。表面上看&#xff0c;这似乎是 K…

云计算(五)—— OpenStack基础环境配置与API使用

OpenStack基础环境配置与API使用 项目实训一 【实训题目】 使用cURL命令获取实例列表 【实训目的】 理解OpenStack的身份认证和API请求流程。 【实训准备】 &#xff08;1&#xff09;复习OpenStack的认证与API请求流程的相关内容。 &#xff08;2&#xff09;熟悉cURL…

mysql慢sql排查与分析

当MySQL遇到慢查询&#xff08;慢SQL&#xff09;时&#xff0c;我们可以通过以下步骤进行排查和优化&#xff1a; 标题开启慢查询日志&#xff1a; 确保MySQL的慢查询日志已经开启。通过查看slow_query_log和slow_query_log_file变量来确认。 如果没有开启&#xff0c;可以…

2.SpringBoot利用Thymeleaf实现页面的展示

什么是Thymeleaf&#xff1f; Thymeleaf是一个现代服务器端Java模板引擎&#xff0c;适用于Web和独立环境&#xff0c;能够处理HTML&#xff0c;XML&#xff0c;JavaScript&#xff0c;CSS甚至纯文本。 Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。为实现这…

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…

Windows系统下安装java开发环境所需的JDK开发工具包

目录 一、JDK开发工具包下载二、安装三、环境变量配置3.1 添加安装包路径3.2 添加lib路径3.3 添加bin目录 四、检查是否安装成功五、总结 一、JDK开发工具包下载 官网地址&#xff1a;JDK下载 打开网址后有多个版本的JDK&#xff0c;学者根据自己电脑需求选择对应版本下载。如…

6.10物联网RK3399项目开发实录-驱动开发之SPI接口的使用(wulianjishu666)

嵌入式实战开发例程&#xff0c;珍贵资料&#xff0c;开发必备&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1149x7q_Yg6Zb3HN6gBBAVA?pwdhs8b SPI 使用 SPI 简介 SPI 是一种高速的&#xff0c;全双工&#xff0c;同步串行通信接口&#xff0c;用于连接微控制器、…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

设计模式总结-建造者模式

建造者模式 模式动机模式定义模式结构模式分析建造者模式实例与解析实例&#xff1a;KFC套餐 模式动机 无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种…

LC低通滤波

LC滤波器&#xff0c;是指将电感L与电容器 C进行组合设计构成的滤波电路&#xff0c;可去除或通过特定频率的无源器件。电容器具有隔直流通交流&#xff0c;且交流频率越高越容易通过的特性。而电感则具有隔交流通直流&#xff0c;且交流频率越高越不易通过的特性。因此&#x…

C#仿OutLook的特色窗体设计

目录 1. 资源图片准备 2. 设计流程&#xff1a; &#xff08;1&#xff09;用MenuStrip控件设计菜单栏 &#xff08;2&#xff09;用ToolStrip控件设计工具栏 &#xff08;3&#xff09;用StatusStrip控件设计状态栏 &#xff08;4&#xff09;ImageList组件装载树节点图…