18

最近、アームコアのアセンブラプログラミングを始めました。私の最初の小さなデモは、.text セクションのみで、問題なく実行されました。

論理的な拡張として、アセンブラー コードを通常のセクション (.text、.data、.bss) に構造化したいと考えました。

だから私は次の簡単なプログラムを書きました:

 .globl _start

 .section .text

 _start:
     b   main
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .
     b   .  


 main:
    ldr r0, x
    nop

 .section .data

 x:  .word  0xf0f0f0f0

 .end

しかし

  /opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o

エラーで終了します

 prog.s: Assembler messages:
 prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up
 make: *** [prog.o] Error 1

アセンブラが再配置について不平を言う理由はわかりません。それはリンカの仕事だと思ったからです。.data セクションがアセンブル段階で最終メモリ位置にないことをアセンブラに伝える必要があると想像できますが、関連するものは何も見つかりません。

コードを正しく組み立てる方法を見つけましたが、置き換えることで

 .section .data

 .org .

それは満足のいく解決策ではありません。特に、ガスのドキュメントがこのセクションの意味を強調しているという事実を考慮して。

たぶん、あなたの専門家の誰かが私が知恵を得るのを手伝ってくれるかもしれません

4

3 に答える 3

24

それを行う唯一の方法は、変数のアドレスを取得し、そのアドレスから値をロードすることです。

ldr r1,=x    ; get address of x
ldr r0,[r1]  ; load from that address

これもある意味、理にかなっています。結局のところ、x のアドレス (リンク後) が PC 相対アクセスに対して遠すぎる場合はどうなるでしょうか? コンパイラ (リンクは行わない) は、データ セクションがテキスト セクションからどれだけ離れているかを認識していないため、到達できない場合に備えて、そのコードのコンパイルを拒否します。

変数にアクセスするこの間接的な方法を使用することにより、変数が到達可能であることが保証されます (または、少なくとも変数が到達可能かどうかをコンパイラーが確認できます)。

http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.sから改作されたコード

于 2012-04-16T09:46:10.230 に答える