MIPSを逆転させるための分岐遅延スロットを理解する

radare2を使用してAtherosAR7161用にコンパイルされたいくつかのソフトウェアを静的に逆転させています。このプロセッサはMIPSを実装しており、MIPSには分岐遅延スロットがあることを思い出します。ブランチがブランチの直後に配置される前に論理的に実行する必要がある命令を確認できるため、これは逆アセンブラで実際に顕著です。

しかし、コードの一部を分析しているときに、それを前提としたbeqz命令に出くわしました。最初に実行する必要がある後の命令は、プログラムのコンテキストでは意味がありません。私の分析が間違っている可能性があることを認めなければなりませんが、それはありそうもないことではありません。ただし、クリアしたいことにも疑問があります。

  • すべての分岐/ジャンプ命令は、直後の命令が論理的に最初に実行されるように、常に分岐遅延スロットを使用しますか? ?そうでない場合、どの場合はそうではありませんか?

  • バイナリでエンコードされたものではなく、radare2に論理的な実行順序を表示させる方法はありますか?

編集:具体的には、次のシーケンスを処理しています:

beqz v0, <some address> lb v0, 0x40(sp) 

パイプラインに入るこれらの命令について、頭の中に非常に拡散した画像があります。最初の命令がデコードされている間に2番目の命令がフェッチされるのを想像できます。 、分岐遅延スロットの実行は実際に開始する必要があります。ただし、分岐命令は、分岐遅延スロットの命令によって変更される同じレジスタに依存するため、どうなりますか?分岐命令は古いレジスタvaを使用して状態を評価しますか? lue、またはlbによって更新された新しいもの?

ありがとう

コメント

  • MIPSシリーズを読むと役立つかもしれません。レイモンド・チェンはこちら:リンク最初の答えはノーです(詳細はリンクを参照してください)。 '秒に答えられません。

答え

分岐遅延スロットの命令は、分岐(またはジャンプ)命令の後に評価されます。分岐遅延スロットでの命令の実行は、分岐条件の評価に影響を与えません。

分岐遅延スロットがいくつかの目的で使用されることを確認しました:

  • 分岐命令に至るまでの基本ブロックの最後の命令
    • 分岐テストは、分岐遅延スロット命令の計算の出力に依存しません
    • 無条件のジャンプ/分岐で一般的に見られますbjal
  • フォールスルーブロックの最初の命令。
    • 分岐が行われた場合、副作用は発生しないはずです。
    • 分析により、分岐が行われた場合、影響を受けるレジスタは不要であることが示されます。
  • 分岐が行われた場合のブロックの最初の命令
    • 分岐ターゲットへのパスが複数ある場合、この命令は異なる分岐で複数回表示される可能性があります
  • 条件値のロード、多くの場合戻り値

この記事分岐遅延スロットについて詳しく説明します。

Igorが指摘したように、「可能性が高い」バージョンの分岐命令は、命令が実際に実行された場合にのみ、命令の効果を分岐遅延スロットに保持します。

回答

  1. 「分岐[条件付き]可能性が高い」と呼ばれる条件分岐のバリエーションがあります。
    • bgezl-ゼロ以上で分岐する可能性が高い
    • beql-分岐する等しい可能性

これらの命令には遅延スロットがありますが、遅延スロットの命令はのみ実行されます分岐が発生した場合。分岐が行われない場合、遅延スロットの命令は実行されません nullified ) 。

注意:これらの手順は、MIPSアーキテクチャのリリース6で削除されました。また、遅延スロットのないブランチのコンパクトなバリエーションも追加されました。

スニペットに関しては、ブランチが old レジスタ値を使用していると強く思われますが、おそらく確認できます。実際のプロセッサで実行するだけです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です