Вы можете пройтись по документации 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 три младших бита (000b
).
Если посмотреть в соответствующей таблице, Mod из 11
указывает операнд регистра, где R / M обозначает EAX
(или AX
в 16-битном режиме) и 000
для Reg при обращении к регистру сегмента: ES
.