Повторите префиксы и обязательные префиксы в x86 - PullRequest
3 голосов
/ 17 ноября 2011

В моем стремлении написать небольшой дизассемблер для Linux, специфичный для арки x86, я столкнулся с небольшой проблемой. Это касается обязательных префиксов и повторных префиксов. Глядя на документы Intel [1], говорится, что повторяющиеся префиксы 0xf2 или 0xf3 , а обязательные префиксы 0x66 , 0xf2 или 0xf3 .

Существуют две инструкции, которые имеют следующие базовые коды операций:

crc32 - f2 0f 38 f0 ( Здесь 0xf2 - обязательный префикс )
movbe - 0f 38 f0

Итак, коды операций команды 'movbe', которая должна повторяться до тех пор, пока регистр счетчика не равен нулю, должны быть:

repnz movbe == f2 0f 38 f0

Когда я начинаю разбирать инструкцию, если я вижу байт 0xf2 , как я узнаю, что это обязательный префикс для инструкции crc32 , но не повторный префикс для инструкции movbe или наоборот? С какой инструкцией мне нужно сопоставить шаблон кода операции "f2 0f 38 f0" с?

Что мне не хватает?

[1] http://www.intel.com/design/intarch/manuals/243191.HTM

Спасибо и всего наилучшего,
Хришикеш Мурали

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Вы можете использовать повторяющиеся префиксы только со строковыми инструкциями (см. Руководство). «f2 0f 38 f0» всегда является инструкцией CRC32.

2 голосов
/ 17 ноября 2011

MOVBE, (перемещение в / из старшего порядка в памяти) , не является инструкцией, повторяемой через префикс REP((N)E).

Только string instructions повторяются таким образом. Это: MOVS*, LODS*, STOS*, SCAS*, CMPS*, INS*, OUTS*, где * имеет значение B, W, D или Q (кроме INS * и OUTS *, которые идут только до двойных слов, а не четырех слов).

Ручной ввод Intel для rep / rep(n)e объясняет это.

...