#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-разрядного префикса размера операнда.