AMD 3Dnow! 指令编码
0F 0F [ModRM] [SIB] [displacement] imm8_opcode |
上面是 AMD 的 3Dnow! 指令的编码格式。
opcode 由 3 部分组成:
(1)opcode 由两个 0F 字节引导出来,在通用指令中 0F 0F 是无效的 opcode 码,AMD 将它用作 3Dnow! 指令的 opcode 码。
(2)指令格式中最后的 imm8 是真正的 opcode 码,由于 3Dnow 指令数量极少。所以大部分 opcode 都是保留未用的。
从 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
指令的 destination 操作数是 mmx 寄存器,由 ModRM.reg 提供寻址。
在目前为数不多的 3Dnow! 指令中,指令的 destination 操作数全部都是 registers 寻址,宽度为 64 位。
AMD 已经不再对 3Dnow! 指令进行扩充,因此,3Dnow! 指令也停止在目前的 24 条指令里。
目的 3Dnow! 指令 source 操作数全部都是 memory 操作数,由 ModRM.r/m 寻址,必要时提供 SIB 辅助寻址。
和通用指令情形一致,对 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