2013-02-19 1 views
8

Например, если гекс: 83 E4 F0x86 узнать размер операнда, заданного только шестнадцатеричным машинным кодом?

Глядя на руководство разработчика Intel, я могу понять, что означает 83and и FO означает -16. Глядя на E4, я могу декодировать, что регистр источника/назначения является SP или ESP.

Поэтому я могу заключить, что шестнадцатеричный означает либо and $-16, %ESP, либо and $-16, %SP. Однако в руководстве оба из них перечислены как 83 /4 ib.

Как я могу провести различие между этими двумя?

+2

Это зависит. Если в реальном режиме или если размер операнда по умолчанию для текущего сегмента/селектора установлен на 16 бит, он будет выполнен как 'и sp, -16'. «Обычно» это будет 32-битная версия. – harold

ответ

7

Как говорит Гарольд, размер операнда по умолчанию не закодирован в инструкции, а зависит от текущего режима процессора.

В режиме реального и 16-разрядного защищенного режима размер операнда по умолчанию составляет 16 бит, поэтому 83 E4 F0 декодирует до and $-16, %sp.

В 32-битном режиме размер операнда по умолчанию равен 32-битным, то есть and $-16, %esp.

В режиме x64 большинство инструкций снова по умолчанию используют размер 32-разрядных операндов (кроме ветвей и те, которые косвенно используют стек, например, нажатия, всплывающие окна, вызовы и возврат), поэтому он снова декодирует до and $-16, %esp.

Можно переопределить размер операнда по умолчанию с помощью префиксов. Например, префикс 66h переключается между размером 32-битного и 16-разрядного операндов, поэтому 66 83 E4 F0 декодирует до and $-16, %esp в 16-разрядном режиме и до and $-16, %sp в 32-разрядном или 64-битном режиме. Чтобы получить размер 64-разрядного операнда, вам нужно использовать REX prefix с бит-бит, поэтому 48 83 E4 F0 декодирует до and $-16, %rsp (но только в 64-битном режиме!).

+0

Есть ли способ узнать, в каком режиме работает процессор? – Hery

+2

Не без лишнего контекста. Откуда берутся байты? Память? Файл? Нашел в вымытой бутылке? Пришел ли вам во сне? –

+0

шестнадцатеричная строка из файла, но кодируется как строка ASCII (все это проект курса, а значит, и простой формат). есть ли что-то вроде регистра, в котором хранится режим работы процессора? – Hery

0

В защищенном режиме это может быть только 32-разрядная версия, для 16-разрядных и 64-разрядных версий требуется байт переопределения размера префикса, в этом случае для 16-разрядной версии требуется переопределение префикса 0x66, поэтому вы получаете 66:83 E4 F0. Intel четко заявляет это в описании для AND:

В 64-разрядном режиме размер операции по умолчанию составляет 32 бита.

и ссылка на 066H, глава 2.2.1:

Операнда размера переопределения префикс позволяют программу для переключения между 16- и 32-битного размера операндом . Любой размер может быть по умолчанию; использование префикса выбирает размер по умолчанию .

+0

Я не являюсь нисходящим, но ваш ответ довольно противоречив комментарию Гарольда ... – Hery

+0

@Hery: предполагая, что hes в 32-битном или 64-битном защищенном режиме (что является «нормой», учитывая, что hes не упоминает ничего об обратном), единственный способ для получения 16 или 64-битных версий с помощью префикса переопределения. Это совсем не противоречит харолду, его определению для защищенного режима (если только он не использует 16-битный процессор, которому почти 30 лет ....). – Necrolis

+1

На самом деле существует 16-разрядный защищенный режим, введенный в 286. –