Бит направления / знака расширения в наборе команд x86 - PullRequest
5 голосов
/ 03 августа 2011

В наборе команд x86 бит с индексом 1 может быть либо битом направления, который указывает, что представляют собой операнды назначения и источника, либо это может быть бит расширения знака. Мне интересно, какой самый простой логический способ определить, какой из этих случаев это. Есть ли способ проверить, кроме проверки кодов операций команд и их сравнения, чтобы выяснить, что это такое (для вариантов расширения знака или направления команд)? Есть также инструкции, которые игнорируют этот бит, но так как он установлен в 0, это не имеет значения.

РЕДАКТИРОВАТЬ: Оказывается, что для ошибок записи (именно для этого был предназначен мой код), reg-> r / m всегда имеет место, потому что инструкция r / m-> reg никогда не вызовет ошибку записи. Но любая информация все равно будет полезна, если кто-то столкнется с подобной проблемой.

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

[Комментарий сделан в ответ].

Вам, очевидно, нужна логическая формула для потока байтов инструкции.Я не знаю, как легко определить эту формулу;у x86 действительно грязный набор инструкций.Я ожидаю, что ключевой трюк заключается в поиске байта кода операции в таблице, определяемой байтами префикса.Если вы пишете какой-то дизассемблер, я ожидаю, что у вас уже есть такие таблицы.

0 голосов
/ 04 августа 2011

Биты направления и знака являются частью регистра флагов процессоров x86. Поскольку младшие восемь битов флагов имеют ту же структуру, что и флаги 8080/8085 / Z80, я предполагаю, что бит в индексе 1 является битом со знаком. Положение бита направления не изменилось, так как он был введен с процессорами 8086/88 в конце 70-х, если мне не изменяет память.

Бит знакового бита изменяется в результате арифметической операции и является копией старшего бита результата операции. INC и DEC не влияют на бит знака.

Бит направления управляется с помощью инструкции cld / std и контролирует, будут ли инструкции блока (cmps, ins, lods, movs, outs, scas и stos) постинкрементно / -decrement.

Ими также можно манипулировать через стек (хотя это, возможно, не имеет смысла со знаком бит)

pushf
and dword ptr [esp],SOME_MASK
popf

В качестве примера можно использовать «и»: также можно использовать xor и другие.

Если вы манипулируете флагом, вам может потребоваться восстановить его прежнее значение, поскольку некоторые библиотеки времени выполнения предполагают, что он не был изменен.

...