Assembly 拆解命令8E C0
我需要拆卸命令8E C0,你能帮我吗 我已经说过: 第一个字节8E=100001110b是mov sr,reg/memAssembly 拆解命令8E C0,assembly,x86,tasm,mov,Assembly,X86,Tasm,Mov,我需要拆卸命令8E C0,你能帮我吗 我已经说过: 第一个字节8E=100001110b是mov sr,reg/mem 但是我不知道如何处理第二个字节11000000,你可以自己翻阅英特尔文档,或者使用更简单的反汇编程序。答案是: mov ES, EAX 我使用yasm,并执行了以下操作: # assemble the two bytes: echo 'lbl: db 0x8e, 0xc0' | yasm -f elf - -o tmp.o # disassemble the output:
但是我不知道如何处理第二个字节11000000,你可以自己翻阅英特尔文档,或者使用更简单的反汇编程序。答案是:
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
对应于英特尔指令集参考中的此指令:
8E/r。。。机动部队,r/m16。。。将r/m16移动到段寄存器
/r
表示以下字节为“Mod r/M”字节。指令的描述表明,我们应该将Reg/Opcode部分解释为段寄存器,段寄存器将作为目标,Mod和R/M部分将指示源。将这些位分开,Mod是最上面的两位(11b
),Reg是接下来的三位(000b
),R/M是最下面的三位(000b
)
在适当的表格中查找,Mod of
11
表示寄存器操作数,R/M表示EAX
(或AX
,在16位模式下)和000
表示Reg,当引用段寄存器时,如果第二个操作数是mem,则表示ES
,我猜这是一个地址。EAX是32位x86程序集AX寄存器的扩展版本。@user785415:mov es,EAX
和mov es,AX
对32位处理器的影响与英特尔文档中的完全相同;不需要16位操作数大小前缀,如果省略,指令执行速度会更快。汇编程序可以将ax
而不是eax
的使用映射到16位操作数大小前缀的加法中。