反汇编命令8E C0

use*_*415 2 x86 assembly tasm mov

我需要拆解命令8E C0,你能帮帮我吗?

我已经做到了这个:

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

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

CB *_*ley 9

您可以通过英特尔文档来自行解决,或者您可以使用更容易的反汇编程序.答案是:

mov ES, EAX
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

如果您想手动执行此操作,则字节可以解释如下.

8E 对应于Intel指令集参考中的此指令:

8E / r ... MOV Sreg,r/m16 ...将r/m16移动到段寄存器

/r指示随后的字节是一个"MOD R/M"字节.指令的描述表明我们应该将Reg/Opcode部分解释为将作为目的地的段寄存器,并且ModR/M部分将指示源.分开位,Mod是前两位(11b),Reg是下三位(000b)和R/M是最后三位(000b).

在相应的表中查找,Mod of 11表示寄存器操作数,R/M表示EAX(或AX在16位模式下),并且当引用段寄存器时000RegES.

  • @ user785415:根据英特尔文档,`mov es,eax`和`mov es,ax`对32位处理器具有完全相同的效果; 不需要16位操作数大小前缀,如果省略,指令将执行得更快.汇编程序_may_映射使用`ax`而不是`eax`添加16位操作数大小前缀. (2认同)