如何手动解释操作码?

时间:2011-05-16 15:44:53

标签: assembly opcode

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

如何将8945fc解释为mov dword ptr [ebp-4],eax

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

89是操作码
   45对来源和目的地进行编码    fc是偏移量(-4)

答案 2 :(得分:1)

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

要获得快速摘要,请查看here

答案 3 :(得分:1)

寻找 mov dword ptr [ebp-4],eax 你有8位代码。你可以轻松搞定 这是程序 对于mov命令给出或者应该存储前六位,然后在LSB上添加目标位(D),其中当目标寄存器中存在寄存器时d = 1,或者当寄存器位于源中时d = 0。这里是寄存器eax在源端,所以应该加0,然后在目标位之后的LSB端添加最后一位称为字位(W位)的位 当有16/32位寄存器时W位= 1或者当有8位寄存器时为0,所以现在根据命令“mov dword ptr [ebp-4],eax”
d bit = 0且w bit = 1 现在你得到8位操作码 那么你必须找到MOD(R / M)字段。 为此,你必须找出3件事。 1)mod值 2)注册值 3)R / M值 这是格式 + ----- + --------- + --------- + | Mod | Reg | R / M | + ----- + --------- + --------- + 如上面的回答所述 然后检查命令 mov dword ptr [ebp-4],eax 根据-4有8位位移,然后mod值= 01 MOD值: 00为没有位移 01为8位位移 10位用于16位位移 11用于注册转移

所以这里 MOD = 01 然后 对于reg eax,值为000 对于(R / M),该值为101

所以R / M字段8位是

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