ラベルが参照しているアドレスをレジスタに格納する命令を作成するにはどうすればよいですか?
4723 次
1 に答える
9
4 つの方法があり、3 つはSourceware の Gnu Assembler manualに記載されています。ラベルはこんな感じだと思います。
target:
.long 0xfeadbeef
adr r0,targetadrl r0,targetldr r0,=targetsub r0,pc,#(.+8-target)
最初の 2 つは非常に似ており、生成されsub r0,pc,#offsetます。3番目は long をリテラルプールに入れ、これを介してロードするか、アセンブラldr r0,[pc,#offset2]が使用できると判断した場合は a を使用します (通常は0x8000のような整列ラベル)。最後のバージョンは、手動で計算することです。mov
との違いは、即値オペランドadrにadrl由来します。これらは、2 の倍数でローテーションされた8 ビットです。そのため、アドレスが遠い場合は、2 つの命令を実行する必要がある場合があります。これは通常、データ キャッシュまたはメモリを介して完全な 32 ビットを取得する3番目 のバリアントよりも高速です。ldr
参照:アセンブラでの再配置
Thumb2 は と の組み合わせmovwを追加しmovtます。例えば、
label:
; data
...
movw r0, :lower16:label - .
movt r0, :upper16:label - .
これにより、オフセットが に挿入されr0ます。これは、PC 相対にはあまり役に立ちませんが、絶対値または定数の直接ロードには役立ちます。
于 2013-04-02T22:03:42.760 に答える