首页 > 解决方案 > x86 BSWAP 指令 REX 不遵循英特尔规范?

问题描述

我一直在用 NASM 和 GAS 组装(和反汇编)BSWAP x64 指令,并且都BSWAP r15490FCF十六进制一样组装指令。反汇编程序也将其反汇编为相同的指令。

因此,指令 ( ) 的 REX 前缀设置49了 REX.W 位(位 3)和 REX.B 位(位 0)。这与英特尔文档形成鲜明对比,该文档指出:

在 64 位模式下,指令的默认操作大小为 32 位。使用 REX.R 形式的 REX 前缀允许访问其他寄存器 (R8-R15)。使用 REX.W 形式的 REX 前缀将操作提升到 64 位。

(强调我的)

所以根据文档,应该设置 REX.W 位和 REX.R 位(第 2 位),而不是 REX.B,给出编码4C0FCF

我的问题是,谁是正确的?组装商还是英特尔?

标签: assemblyx86language-lawyerdisassembly

解决方案


那里的手册有误。请参阅第2.2.1.2 节更多关于 REX 前缀字段中对 REX 前缀的描述,其中说:

REX.B 修改 ModR/M r/m 字段或 SIB 基础字段中的碱基;或者它修改用于访问 GPR 的操作码 reg 字段。

图 2-7以操作码字节编码的寄存器操作数;REX.X & REX.R Not Used看起来像:

图 2-7。 以操作码字节编码的寄存器操作数; REX.X & REX.R 未使用

使用BSWAP操作码 reg 字段。


推荐阅读