3. 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 也是正确的。
| 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