【问题标题】:Instruction set - Decode opcode指令集 - 解码操作码
【发布时间】:2013-07-26 13:01:01
【问题描述】:

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

示例: FF /6 PUSH r/m16 M Valid Valid Push r/m16.

意义是如何表达的?

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

谢谢!

【问题讨论】:

  • 您提供的信息不足。这个操作码在哪里发挥作用?它是在真实的硬件中还是在模拟器中?
  • 在真实硬件中,x86 cpu。

标签: opcode instruction-set


【解决方案1】:

实际上有很多指令使用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 字节)中,有助于区分正确的指令。

来自英特尔参考文档:

许多引用内存中操作数的指令都有一个寻址形式规范- 主操作码后面的标识符字节(称为 ModR/M 字节)。 ModR/M 字节 包含三个字段的信息:

• mod 字段与 r/m 字段组合形成 32 个可能的值:8 寄存器和 24 种寻址模式。

• reg/opcode 字段指定一个寄存器号或三个以上位 操作码信息。 reg/opcode 字段的用途在 主操作码。

• r/m 字段可以将寄存器指定为操作数,也可以与 mod 字段来编码寻址模式。有时,某些组合 mod 字段和 r/m 字段用于表示某些操作码信息 说明。

所以 /d 值实际上是从 reg/opcode 字段中提取的。当 CPU 加载第一个操作码时,它知道应该读取其后的一个额外字节,并读取该字段以完成指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2022-11-23
    • 2016-08-02
    相关资源
    最近更新 更多