如何手动解释操作码?

ker*_*ern 12 assembly opcode

77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax
Run Code Online (Sandbox Code Playgroud)

这是规则:

88  /r   MOV r/m8,r8       2/2           Move byte register to r/m byte
89  /r   MOV r/m16,r16     2/2           Move word register to r/m word
89  /r   MOV r/m32,r32     2/2           Move dword register to r/m dword
Run Code Online (Sandbox Code Playgroud)

如何解释8945fcmov dword ptr [ebp-4],eax

Igo*_*sky 28

我们这里有一个三字节的指令:89 45 fc.第一个字节是操作码字节.在表格中查找,我们可以看到它是一个MOV指令,它需要一个Mod R/M字节.Mod R/M字节具有以下布局:

 7  6   5  4  3   2  1  0
+-----+---------+---------+
| Mod |   Reg   |   R/M   | 
+-----+---------+---------+
Run Code Online (Sandbox Code Playgroud)

我们来看看指令的第二个字节.0x45是二进制的01.000.101.因此,Mod为01,Reg为000,R/M为101.

查阅参考文献,例如这里,我们可以看到Mod = 01和R/M = 101的组合对应于[EBP + sbyte]操作数."sbyte"是一个8位有符号位移,在第三个字节中编码:0xFC.由于位移是有符号的,因此必须将其解释为这样的数字,即-4.

指令旁边的"/ r"注释告诉我们寄存器(第二个)操作数由指令的Reg字段指定.Reg = 000是al/ax/eax.假设默认情况下为32位模式,这将意味着eax.

组装上述所有内容,我们得到

MOV [EBP-4], EAX
Run Code Online (Sandbox Code Playgroud)