3

x86 arch に固有の Linux 用の小さな逆アセンブラーを作成しようとしているときに、小さな問題に直面しました。必須のプレフィックスと繰り返しプレフィックスに関するものです。Intel ドキュメント [1] を見ると、繰り返しプレフィックスは0xf2または0xf3であり、必須プレフィックスは0x660xf2または0xf3であると言われています。

次の基本オペコードを持つ 2 つの命令があります。

crc32 -- f2 0f 38 f0 (ここで、0xf2 は必須のプレフィックスです)
movbe -- 0f 38 f0

したがって、カウンタ レジスタがゼロでない限り繰り返す必要がある「movbe」命令のオペコードは次のようになります。

repnz movbe == f2 0f 38 f0

命令の逆アセンブルを開始するときに、バイト0xf2が表示されている場合、それが crc32 命令の必須プレフィックスであるが、movbe命令の繰り返しプレフィックスではない、またはその逆であることをどのように確認できますか? オペコード パターン「f2 0f 38 f0」と一致する命令はどれですか?

私は何が欠けていますか?

[1] http://www.intel.com/design/intarch/manuals/243191.HTM

ありがとう、よろしく、
Hrishikesh Murali

4

2 に答える 2

4

繰り返しプレフィックスは、文字列命令でのみ使用できます (マニュアルを参照してください)。「f2 0f 38 f0」は常に CRC32 命令です。

于 2011-11-17T06:49:28.847 に答える
2

MOVBE、(メモリ内のビッグエンディアンとの間で移動)REP((N)E)は、プレフィックスを介して繰り返し可能な命令ではありません。

そのようにのみstring instructions繰り返し可能です。MOVS*, LODS*, STOS*, SCAS*, CMPS*, INS*,OUTS*ここで、 は, , or*のいずれかです(ただし、INS* とOUTS * は、クワッド ワードではなくダブル ワードまでしか上がりません)。BWDQ

rep/のインテルのマニュアルエントリrep(n)eそれを説明しています。

于 2011-11-17T06:53:23.813 に答える