x86 命令セットでは、オペコードのインデックス 1 のビットは、デスティネーション オペランドとソース オペランドを指定する方向ビットか、符号拡張ビットのいずれかです。
例えばadd
00 /r ADD r/m8, r8
vsそのビットは、同じニーモニックの vs. を区別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 に設定されているので問題ありません。
編集: 書き込みエラー (私のコードが意図したもの) の場合、ar/m->reg 命令は決して書き込みエラーをトリガーしないため、reg->r/m が常に当てはまることがわかります。しかし、他の誰かが同様の問題に遭遇した場合に備えて、どんな情報でもいいでしょう.