X64指令基本格式

X64指令基本格式

  • 1 REX Prefix结构
  • 2 REX prefix扩展位
    • 2.1 第一种,无SIB字节的内存寻址(mod !=11 )
    • 2.2 第二种,寄存器到寄存器的寻址(无内存操作数,mod=11)
    • 2.3 第三种,带SIB字节的内存寻址(mod!=11 & r/m=100)
    • 2.4 第四种,寄存器操作数编码于操作码字节中
  • 3 RIP寻址

本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。

X64指令与X86指令兼容,因此不再对X86指令结构重复描述,主要以讲解X64上新特性为主。

1 REX Prefix结构

x64指令机器码,在原来X86 32位基础上,增加了Rex Prefix,如下所示:
在这里插入图片描述
AMD推出 x86 扩展 64 位技术时,增加了一个用于访问扩展的 64 位数据 prefix,它是:REX prefix,而 x86 原有的 prefix 则变为了指令格式中的:Legacy prefix

REX prefix 仅存在于 x64 的 64-bit 模式中,在 legacy x86 模式下,REX prefix 是无效的。 Legacy prefix在 x86 和x64下,均是有效的。

REX prefix 的取值范围是:40H - 4FH。在非 64 位模式下,它们是 inc 与 dec 指令;也就是说这些指令在 64 位模式下被重定义为 REX prefix,关于Prefix的介绍真的是少之又少,不过可以在x86/x64 指令编码内幕(适用于 AMD/Intel)学到很多。

这里就简单说一下吧,一个Legacy prefix还有一个REX prefix。这些修饰符是为了改变缺省的寄存器,比如说在32位下mov ax,bx。那么就要有Legacy prefix 0x66修饰,前者还有个作用就是改变当前段寄存器,不多这在目前已经显得不怎么重要了。

到了x64的时候,由于通用寄存器的扩展(主要原因),原本的8个通用寄存器只要3个位来标识,但是现在多了r8~r15,16个通用寄存器怎么办呢,很明显加上一位就能完全标识了。

那么就是REX prefix的作用,看一下这个家伙的结构:
在这里插入图片描述
各个位的含义,如下:
在这里插入图片描述
他有取值范围,前4位一定是4,后四位可选,W,R,X,B。

  • W位,标识改变默认操作数大小,比如现在x64有个汇编代码mov r8,r10。一般很多指令都是默认32位操作数的,只有在CS.L1&&CS.D0的时候才会是64位操作数(我没见过)。
    所以一般都要去改变默认操作数大小,那REX prefix就是0x48 (Inter手册上常说是 REX.W);
  • R位,用来扩展 ModRM.reg 域,000 ~ 111 —> 0 000 ~ 1 111 ,于是现在寄存器的情况变成了如下:
    在这里插入图片描述
  • X位,用来扩展 SIB.index 域;
  • B位,用来扩展 SIB.base, ModRM.r/m 以及 Opcode.reg。

2 REX prefix扩展位

REX prefix=0100WRXB,扩展位WRXB的使用场景,有以下4种。

2.1 第一种,无SIB字节的内存寻址(mod !=11 )

在这里插入图片描述
比如:mov rcx,[r8],机器码:49 8B 0B

  • 扩展ModRM.reg
    在X86 32位架构下,ModRM字节中reg有3位,可以表示eax、ebx、ecx、edx、esi、edi、ebp、esp共8个寄存器。
    但是,在X64架构下,有rax、rbx、rcx、rdx、rsi、rdi、rbp、rsp、r8、r9、r10、r11、r12、r13、r14、r15共16个寄存器,reg原有的3位不够用了,因此,需要与REX prefix中R位合并扩展为4位Rrrr,表示X64架构下这16个寄存器编号,具体编号如下:
r8(/r)
r16(/r)
r32(/r)
r64(/r)
mm(/r)
AL
AX
EAX
RAX
MM0
CL
CX
ECX
RCX
MM1
DL
DX
EDX
RDX
MM2
BL
BX
EBX
RBX
MM3
AH
SP
ESP
RSP
MM4
CH
BP
EBP
RBP
MM5
DH
SI
ESI
RSI
MM6
BH
DI
EDI
RDI
MM7
r8b
r8w
r8d
r8
r9b
r9w
r9d
r9
r10b
r10w
r10d
r10
r11b
r11w
r11d
r11
r12b
r12w
r12d
r12
r13b
r13w
r13d
r13
r14b
r14w
r14d
r14
r15b
r15w
r15d
r15
Rrrr0000000100100011010001010110011110001001101010111100110111101111
  • 扩展ModRM.r/m
    在X86 32位架构下,ModRM字节中r/m有3位,可以表示8种内存寻址方式。
    但是,在X64架构下,由于寄存器数量翻倍,原来的3位不足以表示所有寄存器的寻址方式,因此,需要与REX prefix中B位合并扩展为4位Bbbb,并且与X86 32位架构下一样,再次与ModRM.mod组合,表示64种内存寻址方式,如下所示:
    在这里插入图片描述
    在这里插入图片描述

2.2 第二种,寄存器到寄存器的寻址(无内存操作数,mod=11)

在这里插入图片描述
比如:mov r9,r8,机器码:4D 8B C8
ModRM.reg与ModRM.r/m的扩展与上文描述完全一致,不再赘述。

2.3 第三种,带SIB字节的内存寻址(mod!=11 & r/m=100)

在这里插入图片描述
比如:mov rax,[rbx+rcx*2],机器码:48 8B 04 4B

  • 扩展ModRM.reg
    ModRM.reg的扩展与上文描述完全一致,不再赘述。
  • 扩展SIB.index
    以下为32位时,SIB的寻址地址计算。
    在这里插入图片描述
    也是由于X64下,寄存器数量增加,index只有3位,只能表示8个寄存器。因此需要将REX.X与index合并为4位Xxxx,可以表示16个寄存器。Xxxx为X64架构下寄存器的编号。
  • 扩展SIB.base
    X64下,寄存器数量增加,base只有3位,只能表示8个寄存器。因此需要将REX.B与base合并为4位Bbbb,可以表示16个寄存器。Bbbb为X64架构下寄存器的编号。

2.4 第四种,寄存器操作数编码于操作码字节中

在这里插入图片描述
比如:mov rax,4,机器码:48 C7 C0 04 00 00 00
需要将REX.B与reg合并为4位Bbbb,可以表示16个寄存器。Bbbb为X64架构下寄存器的编号。

3 RIP寻址

X64架构的寻址模式与X86类似,但不完全等同,X64架构提供了一种新的rip相对寻址模式(RIP-Relative),引用单常量地址的指令,被编码为基于rip的偏移量(offsets)。
例如:

mov rax, [addr] 		;指令移动以addr+rip为起始地址的8字节内容到rax寄存器。

在64位模式下,RIP-Relative寻址,实现了一种新的寻址形式,rip相对(相对指令指针)寻址。有效的地址,是通过在下一条指令的64位RIP上增加位移来形成的。在IA-32体系结构和兼容模式下,相对于指令指针的寻址只适用于控制转移指令。

在64位模式下,使用ModR/M寻址的指令可以使用rip相对寻址。没有rip相对寻址,所有ModR/M指令模式都相对于零寻址内存。

RIP相对寻址允许特定的ModR/M模式使用带符号的32位位移来寻址相对于64位RIP的内存。这提供了与RIP的±2GB的偏移范围。rip相对寻址的ModR/M和SIB编码如下表所示。在当前的ModR/M和SIB编码中存在32位位移寻址的冗余形式。有一种ModR/M编码和几种SIB编码。rip相关寻址使用冗余形式进行编码。在64位模式下,ModR/M Disp32(32位位移)编码被重新定义为RIP+ Disp32,而不仅是位移。
在这里插入图片描述
rip相对寻址的ModR/M编码不依赖于使用前缀。具体来说,101B的r/m位域编码(用于选择rip相对寻址)不受REX前缀的影响。例如,选择“R13”(REX.B = 1, r/m = 101B)时,只要mod = 00B仍然会导致rip相对寻址。REX.B结合ModR/ m的4位r/m字段没有被完全解码。为了处理没有位移的R13,软件必须使用1字节的位移0对R13 + 0进行编码。

rip相对寻址由64位模式启用,而不是64位的address-size。使用address-size前缀不会禁用rip相对寻址。地址大小前缀的作用是截断并零扩展计算出的有效地址为32位。

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

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

相关文章

栅栏密码fence cypher

f{_wi3_hlyk_lnceaonr_cirgu04fep} flag{you_kn0w_r4il_f3nce_cipher}

线段树 区间赋值 + 区间加减 + 求区间最值

线段树好题:P1253 扶苏的问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 区间赋值 区间加减 求区间最大。 对于区间赋值和区间加减来说,需要两个懒标记,一个表示赋值cover,一个表示加减add。 区间赋值的优先级大于区间加…

【AI视野·今日Sound 声学论文速览 第三十二期】Tue, 24 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 24 Oct 2023 Totally 20 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚nvas3d, 基于任意录音和室内3D信息合成重建不同听角(位置)处的新的声音。(from apple cmu) website: htt…

在职一年多,一个29岁软件测试工程师的心声

简单的先说一下,坐标西安,16届本科毕业,目前在跳槽,算上国庆节前的面试,一共有面试了5家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少)其中成…

【394.字符串解码】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:string decodeString(string s) {stack<string> s1;s1.push("");stack<int> s2;int i 0, n s.size();while (i < n){//1.如果是数字入…

css:transform实现平移、旋转、缩放、倾斜元素

目录 文档语法示例旋转元素 transform-rotate旋转过渡旋转动画 参考文章 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform 语法 /* Keyword values */ transform: none;/* Function values */ transform: matrix(1, 2, 3, 4, 5, 6); transform: translate…

京东数据分析:2023年9月京东洗地机行业品牌销售排行榜

鲸参谋监测的京东平台9月份洗地机市场销售数据已出炉&#xff01; 9月份&#xff0c;洗地机市场的销售额增长。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;9月京东平台上洗地机的销量为9.2万&#xff0c;销售额将近2.2亿&#xff0c;同比增长约9%。从价格上看&#…

Android NDK开发详解之Android.mk探秘

Android NDK开发详解之Android.mk探秘 概览基础知识变量和宏NDK 定义的 include 变量CLEAR_VARSBUILD_EXECUTABLEBUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARYPREBUILT_SHARED_LIBRARYPREBUILT_STATIC_LIBRARY 目标信息变量TARGET_ARCHTARGET_PLATFORMTARGET_ABI 模块描述变量LOC…

【组件】身份证卡片

效果展示 组件代码 <div class"cardOneRoot"><img :src"itemInfo.psnPicUrl ? itemInfo.psnPicUrl : " alt""/><div class"infoDiv" v-if"itemInfo.noInfo 1"><div v-for"(item2, index2) in …

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制&#xff0c;可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…

保护生产中 Node.js 应用程序安全的 15 项最佳实践

在后端开发方面&#xff0c;Node.js 是开发人员最喜欢的技术之一。它的受欢迎程度不断上升&#xff0c;现已成为在线攻击的主要目标之一。这就是为什么保护 Node.js 免受漏洞和威胁至关重要。 在本指南中&#xff0c;您将看到为生产设计安全 Node.js 应用程序架构的 15 种最佳…

阿里云CTO周靖人:打造一朵AI时代最开放的云

10月31日&#xff0c;在2023云栖大会上&#xff0c;阿里云CTO周靖人表示&#xff0c;面向智能时代&#xff0c;阿里云将通过从底层算力到AI平台再到模型服务的全栈技术创新&#xff0c;升级云计算体系&#xff0c;打造一朵AI时代最开放的云。在现场&#xff0c;周靖人公布了云计…

如何使用内网穿透远程访问Linux SVN服务?

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试&#xff0c;包含道路运输企业主要负责人考试技巧答案和解析及道路运输企业主要负责人复审模拟考试练习。安全生产模拟考试一点通结合…

【ES专题】ElasticSearch快速入门

目录 前言从一个【搜索】说起 阅读对象阅读导航笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…

蓝桥杯(C++ 扫雷)

题目&#xff1a; 思想&#xff1a; 1、遍历每个点是否有地雷&#xff0c;有地雷则直接返回为9&#xff0c;无地雷则遍历该点的周围八个点&#xff0c;计数一共有多少个地雷&#xff0c;则返回该数。 代码&#xff1a; #include<iostream> using namespace std; int g[…

SpringCloud Gateway实现请求解密和响应加密

文章目录 前言正文一、项目简介二、核心代码2.1 自定义过滤器2.2 网关配置2.3 自定义配置类2.4 加密组件接口2.5 加密组件实现&#xff0c;AES算法2.6 启动类&#xff0c;校验支持的算法配置 三、请求报文示例四、测试结果4.1 网关项目启动时4.2 发生请求时 前言 本文环境使用比…

Python基础入门例程27-NP27 朋友们的喜好(列表)

最近的博文&#xff1a; Python基础入门例程26-NP26 牛牛的反转列表&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程25-NP25 有序的列表&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程24-NP24 淘汰排名最后的学生&#xff08;列表&#xff09;-CSDN博客…

2017年第三届 美亚杯电子取证 个人赛题解

记录做题个人赛题目 取证大师直接取证 1 Gary的笔记本电脑已成功取证并制作成镜像 (Forensic Image)&#xff0c;下列哪个是其MD5哈希值。 A.0CFB3A0BB016165F1BDEB87EE9F710C9 B.5F1BDEB87EE9F710C90CFB3A0BB01616 C.A0BB016160CFB3A0BB0161661670CFB3 D.16160CFB3A0BB0161…

如何在MacOS使用homebrew安装Nginx

文章目录 Homebrew安装nginxbrew启动Nginxbrew关闭Nginx 参考文章地址 Homebrew安装nginx 在确保MacOS 安装Homebrew成功以后&#xff0c;执行如下命令 brew install nginx注意&#xff1a;Nginx安装成功后会提示目录位置&#xff1b;每个人的系统可能因为Homebrew的安装位置…