3. x87 指令解析


上一页 返回目录

1、看一下这条指稍复杂的 x87 指令

fadd qword ptr gs:[rax + r10 * 8 + 0x11223344]

这条指令的 operand 寻址是 memory

下面看看它的分解组成部分

65
0100
1
0
1
0
DC
10
000
100
11
010
000
44 33 22 11
legacy prefix
4
W
R
X
B
opcode
mod
reg
r/m
scale
index
base
disp32 = 0x11223344
REX = 4a
ModRM = 84
SIB = d0

这条指令最终的编码是: 65 4a dc 84 d0 44 33 22 11

这条指令是具有代表性的 x87 指令。

实际上对于 x87 指令来说:REX.W 会被忽略,无论 REX.W 是 1 还是 0 这条指令的 operand size 都是 quadword

对于 x87 指令的 operands size 来说,都是固定的。也就是说:不能进行 operands size override 操作,包括 REX.W 的 operand size override 功能。

所以: 65 42 dc 84 d0 44 33 22 11 也是正确的。

 

 

2、例子2

fadd st(3), st(0)

这条指令的 operand 寻址是 registers

frist operand(destination)是 st(3) 寄存器,它由 ModRM.r/m 寻址,而 second operand(source)是 st(0) 寄存器,它由指令的 opcode 内嵌。

它的分解部分是:

dc
11
000
011
opcode
mod
reg
r/m
ModRM = c3

这条指令最终的编码是:dc c3

 

 

上一页 返回目录


mik 写于 2009-05-17 00:38