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)
如何解释8945fc到mov 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)