指令集 - 解码操作码

时间:2013-07-26 09:54:35

标签: opcode instruction-set

我正在尝试了解 / d 如何影响操作码。

实施例: FF / 6 PUSH r / m16 M有效有效推送r / m16。

表达意义如何?

有人能举例说明这种差异吗?

谢谢!

1 个答案:

答案 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加载第一个操作码时,它知道它应该读取后面的一个附加字节,并读取该字段以完成指令。