AMD 3Dnow! 指令编码


返回

 

0F 0F [ModRM] [SIB] [displacement] imm8_opcode

上面是 AMD 的 3Dnow! 指令的编码格式。

 

1、 3Dnow! 的 opcode

opcode 由 3 部分组成:

 

(1)opcode 由两个 0F 字节引导出来,在通用指令中 0F 0F 是无效的 opcode 码,AMD 将它用作 3Dnow! 指令的 opcode 码。

(2)指令格式中最后的 imm8 是真正的 opcode 码,由于 3Dnow 指令数量极少。所以大部分 opcode 都是保留未用的。

 

 

2、 operand 寻址

从 3Dnow! 指令格式看,operand 寻址和通用指令的 operand 寻址是一致的。

只是这里的 registers 不是 GPRs 而是 MMX 寄存器,关于 MMX 寄存器的编码,详见: 寄存器 ID 表

3Dnow! 指令的 registers 寻址只能 mmx0 ~ mmx7

 

以下面这条指令为例,看一看 3Dnow! 指令的编码

pfcmpge mm0, qword ptr gs:[rax + r8 * 8 + 0x11223344]

这条 3Dnow! 指令的 operand 寻址较为有代表型,它的编码分解为:

65
42
0F 0F
10
000
100
11
000
000
44 33 22 11
90
legacy prefix
REX prefix
escape opcode
mod
reg
r/m
scale
index
base
displacement
opcode
ModRM = 84
SIB = c0

这条指仅的编码就是:65 42 0f 0f 84 c0 44 33 22 11 90

 

(1)registers 寻址

指令的 destination 操作数是 mmx 寄存器,由 ModRM.reg 提供寻址。

在目前为数不多的 3Dnow! 指令中,指令的 destination 操作数全部都是 registers 寻址,宽度为 64 位。

AMD 已经不再对 3Dnow! 指令进行扩充,因此,3Dnow! 指令也停止在目前的 24 条指令里。

 

(2)memory 寻址

目的 3Dnow! 指令 source 操作数全部都是 memory 操作数,由 ModRM.r/m 寻址,必要时提供 SIB 辅助寻址。

 

 

3、 3Dnow! 指令在不同的模式下

和通用指令情形一致,对 memory 操作数表现出不同的地址模式。

下面以指令 pfcmpge mm0, [eax] 为例,它的编码 0f 0f 00 90 在不同模式下的表现形式:

指令编码
模式
指令形式
描述
0f 0f 00 90
16 位
pfcmpge mm0, qword ptr [bx+si]
16 位地址模式
32 位
pfcmpge mm0, qword ptr [eax]
32 位地址模式
64 位
pfcmpge mm0, qword ptr [rax]
64 位地址模式

可以看出和通用指令的 memory 寻址没什么两样。

 

返回


mik 写于 2009-05-17 00:38