12
77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax

这是规则:

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

怎么解释8945fcmov dword ptr [ebp-4],eax

4

4 回答 4

28

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

 7  6   5  4  3   2  1  0
+-----+---------+---------+
| Mod |   Reg   |   R/M   | 
+-----+---------+---------+

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

在参考中查找,例如here,我们可以看到Mod=01 和R/M=101 的组合对应于[EBP+sbyte] 操作数。“sbyte”是一个 8 位有符号位移,编码在第三个字节:0xFC。由于位移是有符号的,它必须被解释为这样的数字,即-4。

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

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

MOV [EBP-4], EAX
于 2011-05-16T16:08:00.300 回答
2

89是操作码
45编码源和目标
fc是偏移量(-4)

于 2011-05-16T16:01:52.940 回答
1

如果您想编写自己的反汇编程序,就是您所需要的。

快速总结,看这里

于 2011-05-16T16:02:36.030 回答
1

寻找mov dword ptr [ebp-4],eax你有 8 位代码。你可以很容易地得到它这里是程序的前 6 位给出或应该记住 mov 命令然后在 LSB 上添加目标位(D ) 其中,当目标中有一个寄存器时 d=1 或当寄存器在源中时 d=0。这里的寄存器 eax 在源端,所以应该加 0,然后是最后一位,称为字位(W 位)在目标位之后的 LSB 侧添加,其中当有 16/32 位寄存器时 W 位 = 1,或者当有 8 位寄存器时为 0,所以现在根据命令“mov dword ptr [ebp-4],eax”
d 位 = 0 和 w 位 =1 现在你得到 8 位操作码然后你必须找出 MOD(R/M) 字段。为此,您必须找出三件事。1) mod value 2) register value 3) R/M value 这里的格式是 +-----+---------+---------+ | 国防部 | 注册 | 读/写 | +-----+---------+---------+ 如上面的答案所述,然后检查命令mov dword ptr [ebp-4],eax 有 8位位移根据 -4 然后 mod 值 =01 MOD VALUES:00 表示无位移 01 表示 8 位位移 10 表示 16 位位移 11 用于寄存器到寄存器传输

所以这里 mod=01 然后 reg eax 的值为 000 和 (R/M) 的值为 101

所以 R/M 字段 8 位是

01000101 希望这个描述会有所帮助

于 2013-11-09T10:38:11.877 回答