x86 BSWAP 指令 REX 不符合英特尔规范?
x86 BSWAP instruction REX doesn't follow Intel specs?
我一直在用 NASM 和 GAS 汇编(和反汇编)BSWAP x64 指令,assemble 指令 BSWAP r15
为 490FCF
十六进制。 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
使用操作码注册字段。
我一直在用 NASM 和 GAS 汇编(和反汇编)BSWAP x64 指令,assemble 指令 BSWAP r15
为 490FCF
十六进制。 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
使用操作码注册字段。