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

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

например. для добавить

  • 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 всегда так, потому что инструкция ar / m-> reg никогда не вызовет ошибку записи. Но любая информация будет полезна, если кто-то еще столкнется с подобной проблемой.

6
задан Peter Cordes 3 October 2019 в 07:31
поделиться