2

我试图了解/d如何影响操作码。

示例:FF /6 PUSH r/m16 M 有效 有效 Push r/m16。

意义如何表达?

谁能给我一个不同的例子?

谢谢!

4

1 回答 1

2

实际上有很多指令使用FFas 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 加载第一个操作码时,它知道应该读取其后的一个额外字节,并读取该字段以完成指令。

于 2014-05-21T21:37:47.653 回答