2012-04-10 12 views
8

最近、アームコア用のアセンブラプログラミングが開始されました。私の最初の小さなデモは.textセクションのみで問題なく走った。内部再配置が修正されていません

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

だから私は、次の簡単なプログラムを書いた:、私はアセンブラが移転文句なぜ見当もつかないエラー

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

.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 

終了するので、私はそれがリンカの仕事だと思った。 .dataセクションがアセンブル段階で最終的なメモリ位置に配置されていないことをアセンブラに伝えなければならないと想像できますが、関連するものは何も見つかりません。

私は満足のいく解決策ではない

.org . 

によって

.section .data 

を置換することによって、正しく組み立てられたコードを取得する方法を発見したが。特に、ガスの文書がこのセクションの感覚を強調しているという事実に鑑みて、

たぶん、あなたの誰かは専門家があなたがそれを行うことができる唯一の方法は、変数のアドレスをつかんでいるようで、そのアドレスから値をロードし、私はいくつかの知恵

答えて

13

を得るのを助けることができます。

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

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

コード適合http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

ありがとう、あなたの説明と例をありがとう。これまたは類似のものはbinutils-documentationのarm-sectionに入るべきです。リンカーは大きなスケールを、コーダーは小規模の再配置を覚えています。私はいくつかの余分な時間がある場合、いくつかの逆アセンブルされたCプログラムを研究し、より多くの洞察を得ることを望みます... – user1146332

+0

これは受け入れられた答えですか? – aditya

関連する問題