x86 BSWAP 指令 REX 不符合英特尔规范?

x86 BSWAP instruction REX doesn't follow Intel specs?

我一直在用 NASM 和 GAS 汇编(和反汇编)BSWAP x64 指令,assemble 指令 BSWAP r15490FCF 十六进制。 Disassemblers 也对同一条指令 disassemble this。

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

In 64-bit mode, the instruction’s default operation size is 32 bits. Using a REX prefix in the form of REX.R permits access to additional registers (R8-R15). Using a REX prefix in the form of REX.W promotes operation to 64 bits.

(强调我的)

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

我的问题是,谁是正确的? assemblers 还是英特尔?

那里的手册是错误的。请参阅 2.2.1.2 有关 REX 前缀字段的更多信息 部分中对 REX 前缀的描述,而不是说:

REX.B either modifies the base in the ModR/M r/m field or SIB base field; or it modifies the opcode reg field used for accessing GPRs.

图2-7。在操作码字节中注册操作数; REX.X & REX.R 未使用 看起来像:

BSWAP 使用操作码注册字段。