Команда разборки 8E C0

#assembly #x86 #tasm #mov

#сборка #x86 #tasm #перемещение

Вопрос:

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

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

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

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

Комментарии:

1. Если вторым операндом является mem, я предполагаю, что это адрес.

Ответ №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 как сегментный регистр, который будет местом назначения, а части Mod и R / M будут указывать источник. При разделении битов, Mod — это два верхних бита ( 11b ), Reg — следующие три ( 000b ) и R / M — три нижних бита ( 000b ).

При поиске в соответствующей таблице Mod of 11 указывает на регистровый операнд, где R/M обозначается EAX (или AX в 16-разрядном режиме), а 000 для Reg при обращении к сегментному регистру является ES .

Комментарии:

1. EAX — это расширенная версия регистра AX для 32-разрядной сборки x86.

2. @user785415: mov es,eax и mov es,ax имеют точно такой же эффект на 32-разрядных процессорах в соответствии с документами intel; 16-разрядный префикс размера операнда не требуется, и команда будет выполняться быстрее, если его не использовать. Ассемблер может преобразовать использование ax вместо eax в добавление 16-разрядного префикса размера операнда.