【发布时间】:2013-07-26 13:01:01
【问题描述】:
我试图了解 /d 如何影响操作码。
示例: FF /6 PUSH r/m16 M Valid Valid Push r/m16.
意义是如何表达的?
谁能给我一个不同的例子吗?
谢谢!
【问题讨论】:
-
您提供的信息不足。这个操作码在哪里发挥作用?它是在真实的硬件中还是在模拟器中?
-
在真实硬件中,x86 cpu。
我试图了解 /d 如何影响操作码。
示例: FF /6 PUSH r/m16 M Valid Valid Push r/m16.
意义是如何表达的?
谁能给我一个不同的例子吗?
谢谢!
【问题讨论】:
实际上有很多指令使用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 加载第一个操作码时,它知道应该读取其后的一个额外字节,并读取该字段以完成指令。
【讨论】: