3

次のタスクを与えられました。

次の 16 進値のシーケンスを検討してください。

55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3

このバイト シーケンスは、32 ビット モードの Intel 80386 マシン語のサブルーチンを表します。

  • このサブルーチンの命令が実行されると、レジスタ %ecx および %edx に値が残ります。値は何ですか?

  • このサブルーチンによって行われる計算を実行し、このプログラムによって計算された %ecx と %edx の値を、サブルーチンの実行の最後に表示される C のプログラムは何ですか?

私は 80386 命令セットを覚えていないので、まずこれらのオペコード バイトをアセンブリ言語のニーモニックに変換する必要があります。それで、オンライン参照、16進値を命令にマッピングするテーブルなどはありますか?Intel の Web サイトを調べましたが、何も見つかりませんでした。それとも、これを解読するためのより良い方法はありますか...?

4

5 に答える 5

2

指示が何であるかを確認するには、逆アセンブラを使用する必要があります。NASM パッケージから NDISASM を取得できます。バイトをファイルに保存して実行します。

ndisasm -b 32 file        # -b 32 specifies you're running in 32 bit mode
于 2010-01-31T22:08:53.680 に答える
1

私は逆アセンブラを使用せず、取扱説明書を調べて、ビットの各グループが何を意味するのかを理解します. これにより、対応するアセンブリ命令が取得されます。そこから、それを C に変換するのはそれほど難しくないはずです。x86 でこの割り当てを行うのがめちゃくちゃであるという他のポスターに同意します。SPARC や MIPS のようなものの方がはるかに簡単です (これらには固定幅の命令があるため)。

于 2010-02-01T03:58:49.117 に答える
0

提案された方法よりもはるかに簡単な方法があり、これが教師が念頭に置いている方法だと思います。

  1. コマンドプロンプトに移動します
  2. デバッグを実行する
  3. コマンド「e」
  4. バイト値を入力します
  5. コマンド「u」
  6. 結果を読む

チャートからオペコードをデコードするのは非常に面倒で、それが意図されたものだったとしたら驚きます。

于 2010-02-01T21:57:21.567 に答える
0

Unix を使用している場合は、objdump -d を使用します。

于 2010-02-04T10:21:40.117 に答える