【发布时间】:2011-06-06 05:57:39
【问题描述】:
我需要反汇编命令8E C0,你能帮帮我吗?
我已经做了这个:
第一个字节 8E = 10001110b 它是 mov sr,reg/mem
但我不知道如何处理第二个字节 11000000
【问题讨论】:
-
如果第二个操作数是mem,我猜这是一个地址。
我需要反汇编命令8E C0,你能帮帮我吗?
我已经做了这个:
第一个字节 8E = 10001110b 它是 mov sr,reg/mem
但我不知道如何处理第二个字节 11000000
【问题讨论】:
您可以浏览 intel 文档自行解决,也可以使用更简单的反汇编程序。答案是:
mov ES, EAX
我使用 yasm,并做了以下操作:
# assemble the two bytes:
echo 'lbl: db 0x8e, 0xc0' | yasm -f elf - -o tmp.o
# disassemble the output:
objdump -d -M intel tmp.o
如果您想手动执行此操作,可以按如下方式解释字节。
8E对应Intel指令集参考中的这条指令:
8E /r ... MOV Sreg,r/m16 ... 移动 r/m16 到段寄存器
/r 表示后面的字节是“Mod R/M”字节。指令的描述表明我们应该将 Reg/Opcode 部分解释为一个段寄存器,它将是目标,而 Mod 和 R/M 部分将指示来源。将位分开,Mod 是前两位 (11b),Reg 是接下来的三位 (000b),R/M em> 后三位 (000b)。
在相应的表中查找,11的Mod表示寄存器操作数,R/M表示EAX(或16-中的AX位模式)和 000 用于 Reg 引用段寄存器时是 ES。
【讨论】:
mov es,eax 和 mov es,ax 根据英特尔文档对 32 位处理器的效果完全相同;不需要 16 位操作数大小的前缀,如果省略,指令将执行得更快。汇编器可以将 ax 的使用而不是 eax 映射到添加的 16 位操作数大小前缀中。