x86 BSWAP指令REX不遵循英特尔规范?

owa*_*der 8 x86 assembly disassembly language-lawyer

我已经组装(和拆卸)既NASM和天然气BSWAP的x64指令,并进行汇总指令BSWAP r15为490FCF十六进制.拆卸器也将其拆解为相同的指令.

因此,指令(49)的REX前缀具有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.

我的问题是,谁是正确的?汇编程序还是英特尔?

Jes*_*ter 5

手册错了.请参阅第2.2.1.2节"REX前缀字段的更多内容"中的REX前缀说明,而不是:

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

和图2-7.注册操作码以操作码字节编码; REX.X和REX.R未使用,如下所示:

图2-7. 注册操作码以操作码字节编码;  REX.X和REX.R未使用

在BSWAP使用操作码Reg字段.