2017-11-10 45 views
0

私は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倍に拡大すると意味がありますので、範囲を2倍にします。これを見るもう1つの方法は、オフセットのビット#1-8を保存し、ビット#0は暗黙的にゼロである、つまりバイナリで 'XXXXXXXX0'です。 – Jester

+0

それは意味があります。私はPCが常にアライメントのためにビット[1:0]を0に設定していることを読んでいることを覚えています(16ビットか32ビットの命令かどうかは覚えていません)。 DCB命令の後にALIGNが続くのはなぜですか?申し訳ありませんが、範囲の部分について少し明確にできますか? – Pablo

+0

これは32ビットです。 「DCB」に関しては、はい。マニュアルには次のように書かれています:_ "DCBの後に命令がある場合は、ALIGN命令を使用して命令がアライメントされていることを確認してください。" _( 'DCB'は命令ではなく命令です)。単純にバイトオフセットを使用した場合のように、使用できる範囲は512バイトではなく256バイトです。 – Jester

答えて

0

TBB/TBHは、Thumb2モードでのみ使用できます。

ARM Thumb2命令は常に偶数アドレスから開始します。 PC+4 + {0, 2, 4, 6, 8, ..., 508, 510}に分岐できることは、すべての奇数オフセットが役に立たないため、
PC+4 + {0, 1, 2, 3, 4, ..., 254, 255 }よりも有用です。 As @Jester explained in the first commentに2を掛けると1バイトのオフセットから2倍の範囲が得られ、柔軟性は失われません。

ARMの設計者は、常に4を掛けるように設計されていますが、一般的には512Bが十分な範囲であり、コードブロックを4バイトの倍数にする必要があることがあります。より大きなオフセットが必要な場合は、TBHはハーフワードの16ビットオフセットを使用します(それでも2を掛けます)。

ここで、TBBを使用してジャンプテーブルの実際の例です生の進と、各分岐ターゲットが(
case 3: (0x3164 + 0x9 * 2)のような)に達したかの数学を行う作業分解コメント: Confused by TBB in a section of ARM disassembly

関連する問題