我一直在用NASM和GAS组装(和分解)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

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

最佳答案

那里的手册是错误的。请参阅第2.2.1.2节“关于REX前缀字段的更多信息”中对REX前缀的描述,其中包括:


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


和图2-7。寄存器以操作码字节编码的操作数; REX.X和REX.R未使用,看起来像:

assembly - x86 BSWAP指令REX不符合Intel规范吗?-LMLPHP

BSWAP使用操作码reg字段。

08-25 08:13