2

IDA (mipsb プロセッサ) を使用してファームウェアを逆アセンブルしています

これは、この IDA dissasm でよく見られます。

lui       $t9 , 0x802f

...何もしない$t9...そしてジャンプしない..

lbu      $t9, 0x200+var_24($sp)

そして、それは私には意味がありません。1 行目: $t90x802F0000 になります 2 行目:$t9スタック上のその場所に格納されているバイトになります。

私が正しければ、何がポイントなのですか?これは使用されているコンパイラの事故ですか、それともプログラマーの事故ですか、それとも何か不足していますか?

ここに画像の説明を入力

4

3 に答える 3

3

あなたはこれの前に何が起こるかを示しませんでした。luiの直前にブランチがある場合、ブランチの宛先のコードはロードされたt9値を使用している可能性があります。

さらに、プロセッサ固有のオプションで命令の簡略化を無効にします。800D8328のストアは、アドレスの一部にt9値を使用していると思われ、IDAは完全な値に置き換えることでそれを単純化しました。

于 2012-03-21T11:59:01.090 に答える
1

これはどうやってここにたどり着いたのか謎のままですが、明らかに、lui $t9 , 0x802Fこのコードにはまったく目的がありません(そして、私が見ているファームウェアの他の部分、同じことがわかります..同じナンセンス...同じ値でlui $t9, 0x802f

hsikcah の答えは間違いなく間違っています。(lbu1バイトをロードしますが、レジスタの最初の3バイトをゼロにします)..

答えは私の最初の推測のようです。コンパイラによって削除されなかったのは、コンパイラのアーティファクトまたはコーダーのナンセンスのいずれかです ( m0skit0markgzのコメントでも示唆されています)。

于 2012-02-07T04:47:50.687 に答える
0

lbu 命令は符号拡張されていません。結果として、これら 2 つの命令の後に 0x200+var_24($sp) に 0x12 が含まれるとすると、$t9 の値は ox80200012 になります。これらの命令の組み合わせは、32 ビット メモリ アドレスをロードする場合に一般的です。一般的な例として、ヒープ上のデータ構造を反復処理します。

于 2012-02-03T14:14:25.583 に答える