x64 英特尔操作码 81 /2
x64 Intel Opcode 81 /2
处理器如何区分这两条指令?
81 /2 iw - 将 imm16 加到 r/m16。
81 /2 id - 将 imm32 进位添加到 r/m32.
我在指令中看到的唯一不同之处是立即值的大小,这还不够,对吧?我的意思是,如果立即数是两个字节,一条指令可能就在它之后,处理器不知道它是 4 个字节的立即数还是 2 个字节和另一条指令。
我是否应该为 64 位操作添加 REX 前缀,或者为 9-16 寄存器添加 REX.R?
模式和操作数大小前缀。在 16 位模式下,81 /2 将是 adc rm16, imm16
。在 32 位或 64 位模式下,它将是 adc rm32, imm32
。除非您添加操作数大小覆盖,否则它们会交换位置。
为了adc rm64, imm32
(没有adc rm64, imm64
),它需要一个REX.W前缀,REX.R没有用,因为没有r操作数,REX。 B/X 将只允许您将扩展寄存器用作 rm 操作数(的一部分),并且不要更改操作数的大小。因此,例如 adc r8d, 0xDEADBEEF
是有效的,将是 41 81 D0 EF BE AD DE
.
处理器如何区分这两条指令?
81 /2 iw - 将 imm16 加到 r/m16。
81 /2 id - 将 imm32 进位添加到 r/m32.
我在指令中看到的唯一不同之处是立即值的大小,这还不够,对吧?我的意思是,如果立即数是两个字节,一条指令可能就在它之后,处理器不知道它是 4 个字节的立即数还是 2 个字节和另一条指令。
我是否应该为 64 位操作添加 REX 前缀,或者为 9-16 寄存器添加 REX.R?
模式和操作数大小前缀。在 16 位模式下,81 /2 将是 adc rm16, imm16
。在 32 位或 64 位模式下,它将是 adc rm32, imm32
。除非您添加操作数大小覆盖,否则它们会交换位置。
为了adc rm64, imm32
(没有adc rm64, imm64
),它需要一个REX.W前缀,REX.R没有用,因为没有r操作数,REX。 B/X 将只允许您将扩展寄存器用作 rm 操作数(的一部分),并且不要更改操作数的大小。因此,例如 adc r8d, 0xDEADBEEF
是有效的,将是 41 81 D0 EF BE AD DE
.