Разберите команду 8E C0 - PullRequest
2 голосов
/ 06 июня 2011

Мне нужно разобрать команду 8E C0, вы можете мне помочь?

Я уже сделал это:

Первый байт 8E = 10001110b, это mov sr, reg / mem

Но я не знаю, что делать со вторым байтом 11000000

1 Ответ

9 голосов
/ 06 июня 2011

Вы можете пройтись по документации 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.

...