7

32 ビット x86 命令セット用の逆アセンブラーを開発しています。私のコードは現在、ほとんどの 1 および 2 バイト オペコードを正しくデコードしますが、問題が発生しました。コードの出力を Objdump と比較すると、Objdump は次のように表示されます。

89 14 98                mov    %edx,(%eax,%ebx,4)

8b 45 d8                mov    -0x28(%ebp),%eax

一方、私のコードは次のようになります:-

89 14 98 8B 45 D8 89   MOV.

Intel のドキュメント (特に Modrm および Sib アドレス指定フォーム テーブル) の理解から、このバイト ストリームは次のように解釈する必要があります。

89 - The opcode
14 - The Modrm byte
98 - The Sib byte specified by the Modrm byte (as shown in Intels Modrm addressing table)
8B 45 D8 89 - The four byte displacement specified by the Sib byte (as shown in Intels Sib addressing table).

Objdump は、変位バイトがないと言っていますが、私のコードとインテルのドキュメントの両方が (少なくとも私には) そうでないと言っているようです。

誰かが私のエラーがどこにあるかを指摘できれば、それは大歓迎です。

ありがとう。

4

1 に答える 1

4

Mod/RM バイト 0x14 は Mod=00 Reg=010 R/M=100 に分解されます。

http://download.intel.com/design/intarch/manuals/24319101.pdf表 2-2 ( 「2-6」というラベルの付いたページ、実際には PDF の 36 ページ) では、Mod=00 R/M=100 が示されています。置換のない SIB として。

使用しているドキュメントを指定していないため、どの部分を読み間違えたのかわかりません。さまざまなインテルのマニュアルがたくさんあります。

于 2012-08-20T22:11:07.133 に答える