Бит расширения направления/знака в кодировке кода операции x86

В наборе инструкций x86 бит в индексе 1 кода операции может быть либо битом направления, указывающим, что такое операнды назначения и источника, либо битом расширения знака.

например для add

  • 00 /r ADD r/m8, r8 и 02 /r ADD r8, r/m8
    Этот бит отличает r/m, reg от reg, r/m для одной и той же мнемоники.
  • 81 /0 id ADD r/m32, imm32 по сравнению с 83 /0 ib ADD r/m32, imm8
    полным (бит 1 очищен) по сравнению с расширенным знаком (бит 1 установлен)

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

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


person Jesus Ramos    schedule 03.08.2011    source источник
comment
Да, это то, чего я пытался избежать, но если я не могу найти лучшее решение, то мне придется пойти на это.   -  person Jesus Ramos    schedule 03.08.2011


Ответы (2)


[Комментарий превращен в ответ].

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

person Ira Baxter    schedule 03.08.2011
comment
Если я действительно не могу найти лучший ответ, я думаю, я пойду с этим, а пока я подожду и посмотрю, есть ли у кого-нибудь еще какие-либо идеи. - person Jesus Ramos; 03.08.2011

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

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

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

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

pushf
and dword ptr [esp],SOME_MASK
popf

Использование «и» является примером: также могут использоваться «или», «исключающее ИЛИ» и другие.

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

person Olof Forshell    schedule 04.08.2011
comment
Я думаю, что OP говорит о бите, который сообщает процессору, идет ли информация в регистры или в память, а не бит направления флагов. - person Ira Baxter; 04.08.2011
comment
Если я неправильно понял вопрос, всегда есть Руководство разработчика программного обеспечения для архитектуры Intel, том 2, где Приложение A содержит карту кода операции. - person Olof Forshell; 05.08.2011
comment
Да, это бит направления, который определяет операнды инструкции, будь то reg->r/m или r/m->reg. - person Jesus Ramos; 05.08.2011