2012-04-10 33 views
8

Geçtiğimiz günlerde kol çekirdekleri için assembler programlamayı başlattım. İlk küçük demolarım, sadece .txt bölümü ile herhangi bir problem yaşamadan koştum.dahili yeniden konumlandırma düzeltilemedi

Mantıksal bir uzantı olarak, assembler kodunu normal bölümlere yapılandırmak istedim: .text, .data, .bss. Çünkü, hata ben montajcı tehcir şikayetçi neden hiçbir ipucu var

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

ile

.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 

Ama

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

çıkışları:

Yani ben şu basit program yazdım Ben bu linker görevi olduğunu düşündüm. Montajcıya, .data bölümünün montaj aşamasında son bellekte yer almadığını söylemem gerektiğini düşünebilirdim, ancak ilgili hiçbir şey bulamıyorum.

i tatmin edici bir çözüm değildir

.org . 

tarafından

.section .data 

değiştirilmesiyle, doğru bir şekilde monte kodu almak için bir yol bulmuş olmasına rağmen. Özellikle gaz dokümantasyonunun bu bölümün anlamını vurguladığı göz önüne alındığında.

Belki uzmanların birisi bana bazı bilgelik

cevap

13

Size değişkenin adresini kapma gereğidir yapmak ve o adresten bir değer yükleyebilecek tek yolu gibi görünüyor kazanmak için yardımcı olabilir.

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

Bir bakıma bu da bir anlam ifade eder. Sonuçta, x'in (bağlantıdan sonra) adresi, PC'ye ait bir erişim için çok uzaksa ne olur? Derleyici (bağlantıyı yapmayan), veri bölümünün metin bölümünden ne kadar uzakta olabileceğini bilmediğinden, bu kodun erişilebilir olmadığında derlenmesini reddeder.

Bir değişkene erişmenin bu dolaylı yolunu kullanarak, değişkene erişilebileceği garanti edilir (veya en azından derleyici, değişkene erişilip erişilemeyeceğinden emin olabilir).

Kod senin açıklama ve örnek için teşekkür ederiz http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

uyarlanmıştır. Bu veya benzer bir şey binutils belgelerinin kol bölümüne gitmelidir. Bağlayıcının büyük ölçekli ve kodlayıcıyı küçük ölçekli yeniden yerleştirmeyi yaptığını ezberleyeceğim. Biraz fazla zamanım varsa, bazı c-programlarını incelerim ve biraz daha içgörü kazanmayı umuyorum ... – user1146332

+0

bu kabul edilen cevap mı? – aditya

İlgili konular