私はTBBがどのようにアセンブリのswitch文のために働くかを理解しようとしています。私は教科書/オンラインマニュアルにそれがどのように記述されているのかを見ていますが、分岐表のオフセットがどのように働くのか分かりません。 分岐テーブルから命令にどのように移行しますか?正しいオフセットを得るためにラベルを減算する方法と、なぜ2で除算するのですか?私の教科書でARMアセンブリTBB命令 - ジャンプはどのように機能しますか?
それは次のようにプログラムが 分岐が計算されなければならないための命令のメモリアドレス
を言う:
ターゲット= PC + 4 +( 2 * BranchTable [R0] )
ここで、r0はブランチテーブル内のオフセットを含むカウンタです。 TBBでは、PCはすでに次の命令(分岐表、PC = PC + 4)を指しています。分岐テーブルは、おそらく第2のオフセットを適切な命令(2 * BranchTable [r0])にロードする。私の教科書やオンラインで見たことから、ブランチテーブルのラベルは命令ラベルから差し引かれます。これは4nのようなもののオフセットを与えるはずです。なぜ2で割りますか?ありがとうございました!
編集:だから私はいくつかの数学を行なったし、それが分岐テーブルのオフセットは、[ -/2(LABEL1 LABEL2)]であることが判明したいくつかの数学に
をしました。式を先に差し込むと、target = PC + 4 +(label 2 - label)になります。これは理にかなっていますが、私はまだ誰かが理由があるのか、それとも私の論理が間違っているのかを知りたいのですが、なぜTBBが2で割って、2で乗算するのですか?
命令アドレスは常にあるので、それでも、2倍に拡大すると意味がありますので、範囲を2倍にします。これを見るもう1つの方法は、オフセットのビット#1-8を保存し、ビット#0は暗黙的にゼロである、つまりバイナリで 'XXXXXXXX0'です。 – Jester
それは意味があります。私はPCが常にアライメントのためにビット[1:0]を0に設定していることを読んでいることを覚えています(16ビットか32ビットの命令かどうかは覚えていません)。 DCB命令の後にALIGNが続くのはなぜですか?申し訳ありませんが、範囲の部分について少し明確にできますか? – Pablo
これは32ビットです。 「DCB」に関しては、はい。マニュアルには次のように書かれています:_ "DCBの後に命令がある場合は、ALIGN命令を使用して命令がアライメントされていることを確認してください。" _( 'DCB'は命令ではなく命令です)。単純にバイトオフセットを使用した場合のように、使用できる範囲は512バイトではなく256バイトです。 – Jester