ラベルが参照しているアドレスをレジスタに格納する命令を作成するにはどうすればよいですか?
4723 次
1 に答える
9
4 つの方法があり、3 つはSourceware の Gnu Assembler manualに記載されています。ラベルはこんな感じだと思います。
target:
.long 0xfeadbeef
adr r0,target
adrl r0,target
ldr r0,=target
sub 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 に答える