【问题标题】:Disassemble command 8E C0反汇编指令 8E C0
【发布时间】:2011-06-06 05:57:39
【问题描述】:

我需要反汇编命令8E C0,你能帮帮我吗?

我已经做了这个:

第一个字节 8E = 10001110b 它是 mov sr,reg/mem

但我不知道如何处理第二个字节 11000000

【问题讨论】:

  • 如果第二个操作数是mem,我猜这是一个地址。

标签: assembly x86 tasm mov


【解决方案1】:

您可以浏览 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 部分解释为一个段寄存器,它将是目标,而 ModR/M 部分将指示来源。将位分开,Mod 是前两位 (11b),Reg 是接下来的三位 (000b),R/M em> 后三位 (000b)。

在相应的表中查找,11Mod表示寄存器操作数,R/M表示EAX(或16-中的AX位模式)和 000 用于 Reg 引用段寄存器时是 ES

【讨论】:

  • EAX 是 AX 寄存器的扩展版本,适用于 32 位 x86 程序集。
  • @user785415: mov es,eaxmov es,ax 根据英特尔文档对 32 位处理器的效果完全相同;不需要 16 位操作数大小的前缀,如果省略,指令将执行得更快。汇编器可以ax 的使用而不是 eax 映射到添加的 16 位操作数大小前缀中。
猜你喜欢
  • 2011-12-29
  • 2011-08-06
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2019-11-23
  • 1970-01-01
相关资源
最近更新 更多