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