我试图了解/d如何影响操作码。
示例:FF /6 PUSH r/m16 M 有效 有效 Push r/m16。
意义如何表达?
谁能给我一个不同的例子?
谢谢!
我试图了解/d如何影响操作码。
示例:FF /6 PUSH r/m16 M 有效 有效 Push r/m16。
意义如何表达?
谁能给我一个不同的例子?
谢谢!
实际上有很多指令使用FF
as opcode:
INC rm16 FF /0
INC rm32 FF /0
INC rm64 FF /0
DEC rm16 FF /1
DEC rm32 FF /1
DEC rm64 FF /1
CALL rm16 FF /2
CALL rm32 FF /2
CALL rm64 FF /2
CALL FAR mem16:16 FF /3
CALL FAR mem16:32 FF /3
JMP rm16 FF /4
JMP rm32 FF /4
JMP rm64 FF /4
JMP FAR mem16:16 FF /5
JMP FAR mem16:32 FF /5
PUSH rm16 FF /6
PUSH rm32 FF /6
PUSH rm64 FF /6
如您所见,/d部分是一个 3 位序列,保存在操作码后面的字节(所谓的 ModR/M 字节)中,有助于区分正确的指令。
来自英特尔参考文档:
许多引用内存中操作数的指令在主操作码之后都有一个寻址形式的说明符字节(称为 ModR/M 字节)。ModR/M 字节包含三个信息字段:
• mod 字段与 r/m 字段组合形成 32 个可能的值:8 个寄存器和 24 种寻址模式。
• reg/opcode 字段指定寄存器编号或另外三位操作码信息。reg/opcode 字段的用途在主操作码中指定。
• r/m 字段可以将寄存器指定为操作数,也可以与 mod 字段组合以编码寻址模式。有时,mod 字段和 r/m 字段的某些组合用于表示某些指令的操作码信息。
因此/d值实际上是从reg/opcode字段中提取的。当 CPU 加载第一个操作码时,它知道应该读取其后的一个额外字节,并读取该字段以完成指令。