6

ラベルが参照しているアドレスをレジスタに格納する命令を作成するにはどうすればよいですか?

4

1 に答える 1

9

4 つの方法があり、3 つはSourceware の Gnu Assembler manualに記載されています。ラベルはこんな感じだと思います。

 target:
     .long 0xfeadbeef
  1. adr r0,target
  2. adrl r0,target
  3. ldr r0,=target
  4. sub r0,pc,#(.+8-target)

最初の 2 つは非常に似ており、生成されsub r0,pc,#offsetます。3番目は long をリテラルプールに入れ、これを介してロードするか、アセンブラldr r0,[pc,#offset2]が使用できると判断した場合は a を使用します (通常は0x8000のような整列ラベル)。最後のバージョンは、手動で計算することです。mov

との違いは、即値オペランドadradrl由来します。これらは、2 の倍数でローテーションされた8 ビットです。そのため、アドレスが遠い場合は、2 つの命令を実行する必要がある場合があります。これは通常、データ キャッシュまたはメモリを介して完全な 32 ビットを取得する3番目 のバリアントよりも高速です。ldr

参照:アセンブラでの再配置


Thumb2 は と の組み合わせmovwを追加しmovtます。例えば、

label:
 ; data
...
movw    r0, :lower16:label - .
movt    r0, :upper16:label - . 

これにより、オフセットが に挿入されr0ます。これは、PC 相対にはあまり役に立ちませんが、絶対値または定数の直接ロードには役立ちます。

参照:定数に関する ARM ブログ

于 2013-04-02T22:03:42.760 に答える