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
?
答案 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)
答案 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 希望这个描述会有所帮助