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 

बाहर निकलता है, क्योंकि:

तो मैं निम्नलिखित साधारण प्रोग्राम लिखा था मैंने सोचा कि यह लिंकर का काम है। मैं कल्पना कर सकता हूं कि मुझे असेंबलर को बताना है कि मेरा .डेटा अनुभाग संयोजन चरण में अंतिम स्मृति पद पर स्थित नहीं है, लेकिन मुझे कुछ भी संबंधित नहीं मिल रहा है।

हालांकि मैं द्वारा

.org . 

कि एक संतोषजनक समाधान नहीं है

.section .data 

की जगह कोड सही ढंग से इकट्ठा किया, पाने के लिए एक रास्ता मिल गया। विशेष रूप से इस तथ्य को ध्यान में रखते हुए कि गैस दस्तावेज इस खंड की भावना को उजागर करता है।

शायद तुम विशेषज्ञों की कोई मुझे कुछ ज्ञान

उत्तर

13

यह एक ही तरीका है कि आप इसे चर का पता हथियाने के द्वारा होता है क्या करना है और उस पते से एक मूल्य के लोड कर सकते हैं लगता है हासिल करने के लिए कर सकते हैं।

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

एक तरह से, यह भी समझ में आता है। आखिरकार, क्या होगा यदि एक्स (लिंकिंग के बाद) का पता पीसी के सापेक्ष एक्सेस के लिए बहुत दूर है? चूंकि संकलक (जो लिंकिंग नहीं करता है) यह नहीं जानता कि टेक्स्ट सेक्शन में सेक्शन अनुभाग कितना दूर हो सकता है, यह उस कोड को संकलित करने से इंकार कर देगा, अगर यह पहुंच योग्य नहीं है।

एक चर का उपयोग करने के इस अप्रत्यक्ष तरीके का उपयोग करके, यह गारंटी दी जाती है कि चर पहुंच योग्य होगा (या कम से कम संकलक यह सुनिश्चित कर सकता है कि चर पहुंच योग्य है या नहीं)।

कोड से http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

अनुकूलित अपने विवरण और उदाहरण के लिए धन्यवाद। यह या कुछ समान बिनुटिल्स-दस्तावेज के आर्म-सेक्शन में जाना चाहिए। मैं याद रखूंगा कि लिंकर बड़े पैमाने पर और कोडर छोटे पैमाने पर स्थानांतरण करता है। अगर मेरे पास कुछ अतिरिक्त समय है तो मैं कुछ अलग-अलग सी-प्रोग्राम का अध्ययन करूंगा और कुछ और अंतर्दृष्टि प्राप्त करने की आशा करता हूं ... – user1146332

+0

क्या यह स्वीकार्य उत्तर है? – aditya

संबंधित मुद्दे