我正在尝试了解 / d 如何影响操作码。
实施例: FF / 6 PUSH r / m16 M有效有效推送r / m16。
表达意义如何?
有人能举例说明这种差异吗?
谢谢!
答案 0 :(得分:2)
实际上有很多指令使用FF
作为操作码:
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字节),这有助于区分正确的指令。
来自英特尔参考文档:
许多指向内存中操作数的指令都有一个寻址形式规范 主操作码后面的ifier字节(称为ModR / M字节)。 ModR / M字节 包含三个信息领域:
•mod字段与r / m字段组合以形成32个可能的值:8 寄存器和24种寻址模式。
•reg / opcode字段指定寄存器号或三个以上的位 操作码信息。 reg / opcode字段的目的在。中指定 主要操作码。
•r / m字段可以将寄存器指定为操作数,也可以将其与 用于编码寻址模式的mod字段。有时,某些组合 mod字段和r / m字段用于表示某些操作码的操作码信息 指令。
因此 / d 值实际上是从 reg / opcode 字段中提取的。当CPU加载第一个操作码时,它知道它应该读取后面的一个附加字节,并读取该字段以完成指令。