2011-08-03 13 views
5

x86命令セットでは、インデックス1のビットは、デスティネーションオペランドとソースオペランドの内容を指定する方向ビットまたは符号拡張ビットとすることができます。私は、これらのケースのどれを判断するのが最も簡単で論理的な方法であるか疑問に思っています。命令のオペコードをチェックして比較する方法がありますか(命令の符号拡張または方向ビットの変種の場合)かどうかを調べる方法はありますか?このビットを無視する命令もありますが、0に設定されているため、実際には問題にはなりません。Direction/Sign x86命令セットのビット拡張

EDIT:r/m-> reg命令が書き込みフォルトを引き起こすことはないため、書き込みフォルト(これは私のコードが意図していたもの)のためにreg-> r/mが常に当てはまります。しかし、他の誰かが同様の問題に遭遇している場合には、どんな情報でも問題ありません。

+0

これは私がやっていることを避けようとしていたものでしたが、私がより良い解決策を得ることができない場合は、それが私の問題です。 –

答えて

2

[回答に答えました]

明らかに、命令バイトのストリームに対してブール式が必要です。私はその式を簡単に定義する方法を知らないだろう。 x86には本当に面倒な命令セットがあります。私はキーのトリックは、プレフィックスバイトによって決定されたテーブルのオペコードバイトを検索することだと思います。あなたが何らかの逆アセンブラを書いているのであれば、とにかくそのようなテーブルを持っていることを期待します。

+0

私は本当に良い答えを見つけることができない場合、私はこれと一緒に行くだろうと思う、今私は待って、誰か他のアイデアがあるかどうかを確認します。 –

0

方向と符号ビットは、x86プロセッサのフラグレジスタの一部です。フラグの最下位8ビットは8080/8085/Z80のフラグと同じレイアウトなので、インデックス1のビットは符号付きビットです。方向ビットの位置は、私の記憶が私に役立つならば70年代後半に8086/88プロセッサで導入されて以来変わっていません。

符号ビットは算術演算の結果として変更され、演算の結果の最上位ビットのコピーです。 INCとDECは符号ビットに影響しません。

方向ビットはcld/std命令を使用して操作され、ブロック命令(cmps、ins、lods、movs、outs、scasおよびstos)の後にインクリメント/デクリメントするかどうかを制御します。 (これはおそらく、符号ビットと意味がありませんが)

また、

pushf 
and dword ptr [esp],SOME_MASK 
popf 

スタックを介して操作することができる使用「および」例である:または、XORなどを用いてもよいです。

フラグを操作する場合、いくつかの実行時ライブラリは変更されていないと想定して、以前の値に復元する必要があります。

+0

私はOPが、情報がレジスタに行くのか、メモリに向かうのか、フラグの方向ビットではなく、プロセッサに伝えるビットについて話していると思います。 –

+0

質問に誤解があった場合は、常に[Intel Architecture Software Developer's Manual、Volume 2](http://download.intel.com/design/intarch/manuals/24319101.pdf)を参照してください。付録Aにはオペコードマップが含まれています。 –

+0

はい、reg-> r/mまたはr/m-> regのいずれかの命令オペランドを指定する方向ビットです –

関連する問題