2013-07-26 46 views
2

我试图了解/d如何影响操作码。指令集 - 解码操作码

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

含义如何表达?

任何人都可以给我一个区别的例子吗?

谢谢!

+0

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

+0

。 – user2622189

回答

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字段指定一个寄存器编号或 操作码信息的三个位。注册码/操作码字段的用途在主操作码 中指定。

•r/m字段可以指定一个寄存器作为操作数,或者它可以与 mod字段组合以编码寻址模式。有时,mod域和r/m域的某些组合用于表示某些 指令的操作码信息。

这样/d值实际上从REG /操作码字段萃取。当CPU加载第一个操作码时,它知道它应该读取其后的一个附加字节,并读取该字段以完成指令。