2010-12-12 5 views
13

मैं जीएनयू के रूप में एआरएम कॉर्टेक्स-एम 3 आधारित माइक्रोकंट्रोलर (थंब 2 निर्देश सेट) के लिए एक असेंबली प्रोग्राम पर काम कर रहा हूं।जीएएस ईएलएफ निर्देश कब हैं। टाइप,। थंब, .size और .section की आवश्यकता है?

कुछ उदाहरण कोड में मुझे .size, .section और .type जैसे निर्देश मिलते हैं जो मैं समझता हूं कि ईएलएफ निर्देश हैं। एक उदाहरण के रूप: - आमतौर पर या तो% वस्तु (? डेटा अर्थ) या% कार्य करने के लिए

.section .text.Reset_Handler 
    .weak  Reset_Handler 
    .type  Reset_Handler, %function 
Reset_Handler: 
    bl  main 
    b  Infinite_Loop  
    .size Reset_Handler, .-Reset_Handler 



.type निर्देश एक प्रतीक के प्रकार सेट करने के लिए कहा जाता है। मुझे नहीं पता कि इससे क्या फर्क पड़ता है। यह हमेशा शामिल नहीं होता है, इसलिए जब मुझे इसका उपयोग करने की आवश्यकता होती है तो मुझे यकीन नहीं है।

इससे संबंधित .thumb_func निर्देश भी है। से मैं क्या पढ़ा है यह यह की तरह लगता है के बराबर हो सकता है:

.thumb 
.type Symbol_Name, %function 

या वह कुछ ऐसा पूरी तरह से अलग है?



.size माना जाता है कि प्रतीक के साथ जुड़े आकार को सेट किया गया है। जब इसकी आवश्यकता होती है, तो मुझे कोई जानकारी नहीं है। क्या यह डिफ़ॉल्ट रूप से गणना की जाती है, लेकिन इस निर्देश के साथ ओवरराइड करने योग्य है? यदि हां - तो आप कब ओवरराइड करना चाहते हैं?



.section पर दस्तावेज़ ढूंढने के लिए आसान है, और मुझे लगता है कि मैं इसे क्या करता है का एक उचित विचार है, लेकिन मैं अभी भी उपयोग के बारे में थोड़ा अनिश्चित हूं। जिस तरह से मैं इसे समझता हूं, यह कोड के लिए अलग-अलग ईएलएफ अनुभागों ( text, data के लिए लिखने योग्य डेटा, bss के लिए प्रारंभिक डेटा, rodata स्थिरांक के लिए, और अन्य) के बीच स्विच करता है, और वांछित होने पर नए को परिभाषित करता है। मुझे लगता है कि आप इस पर निर्भर करते हैं कि आप कोड, डेटा, अनियमित डेटा इत्यादि को परिभाषित करते हैं या नहीं, लेकिन उपरोक्त उदाहरण में, आप फ़ंक्शन के लिए उपखंड क्यों बनायेंगे?


इसके साथ किसी भी मदद की सराहना की जाती है। यदि आप ट्यूटोरियल्स या दस्तावेज़ों के लिंक पा सकते हैं जो इसे अधिक विस्तार से समझाते हैं - नौसिखिए के लिए अधिमानतः समझने योग्य - मैं बहुत आभारी हूं।

अब तक, Using as मैनुअल कुछ मदद की गई है - शायद आप अधिक जानकारी के साथ मुझसे अधिक प्राप्त कर सकते हैं।

+2

मैंने विशेष रूप से .type और .size निर्देशों के बारे में अधिक विस्तृत उत्तर प्राप्त करने की उम्मीद में प्रश्न के लिए एक बक्षीस जोड़ा है। – Oystein

+0

इसे प्रति निर्देश एक प्रश्न में विभाजित किया जाना चाहिए। सलाह: ईएलएफ प्रारूप को समझें, फिर प्रत्येक निर्देश के साथ और उसके बिना न्यूनतम उदाहरण बनाएं, संकलित करें और उन पर 'readelf -a'। –

उत्तर

10

मैं कई वर्षों के असेंबलर के लिए प्रोग्रामिंग आर्म/थंब प्रोग्रामिंग कर रहा हूं और वहां कई निर्देशों की बहुत कम आवश्यकता है।

.thumb_func एक अन्य उत्तरदाता द्वारा बताए गए अनुसार काफी महत्वपूर्ण है।

उदाहरण

 
.globl _start 
_start: 
    b reset 

reset: 

.arm 

.globl one 
one: 
    add r0,r0,#1 
    bx lr 

.thumb 

.globl two 
two: 
    add r0,r0,#2 
    bx lr 

.thumb_func 
.globl three 
three: 
    add r0,r0,#3 
    bx lr 


.word two 
.word three 

.arm या .code32 की तरह कुछ हुआ करता था या 32 .code के लिए

बताता है कि यह इस हाथ कोड नहीं अंगूठे कोड है, जो आपके प्रांतस्था-एम 3 के लिए आप अभ्यस्त उपयोग करने की आवश्यकता है।

। इसी तरह, थंब 16 या शायद अभी भी काम करता है, वही सौदा निम्नलिखित कोड अंगूठे हाथ नहीं बनाता है।

यदि आपके द्वारा उपयोग किए जाने वाले लेबल वैश्विक लेबल नहीं हैं जिन्हें आपको अन्य फ़ाइलों या अप्रत्यक्ष रूप से शाखा करने की आवश्यकता है, तो .thumb_func की आवश्यकता नहीं है। लेकिन इन वैश्विक लेबलों में से किसी एक शाखा के पते को ठीक से गणना करने के लिए (एलएसबीटी अंगूठे के लिए 1 और हाथ के लिए 0 है) आप इसे अंगूठे या बांह लेबल के रूप में चिह्नित करना चाहते हैं और thumb_func ऐसा करता है, अन्यथा आप अधिक कोड जोड़ने शाखाओं से पहले कि बिट सेट करने के लिए और लेबल .thumb कोडांतरक हाथ कोड के रूप में वांछित है अप करने के लिए सी

 

00000000 <_start>: 
    0: eaffffff b 4 <one> 

00000004 <one>: 
    4: e2800001 add r0, r0, #1 
    8: e12fff1e bx lr 

0000000c <two>: 
    c: 3002  adds r0, #2 
    e: 4770  bx lr 

00000010 <three>: 
    10: 3003  adds r0, #3 
    12: 4770  bx lr 
    14: 0000000c andeq r0, r0, ip 
    18: 00000011 andeq r0, r0, r1, lsl r0 

से प्रतिदेय नहीं है।

दोनों और तीन लेबल/फ़ंक्शन दोनों वांछित कोड हैं, लेकिन दोनों लेबल में एक क्रमांकित पता है और तीन में उचित विषम पता है।

नवीनतम कोडकोरी उपकरण उपरोक्त नमूने को इकट्ठा करने, जोड़ने और डंप करने के लिए उपयोग किए जाते थे।

अब कॉर्टेक्स-एम 3 के लिए जहां सबकुछ अंगूठे (/ thumb2) thumb_func महत्वपूर्ण नहीं हो सकता है, यह केवल कमांड लाइन स्विच के साथ काम कर सकता है (पता लगाने के लिए एक प्रयोग करने में बहुत आसान है)। यह एक अच्छी आदत है कि यदि आप एक अंगूठे से केवल एक सामान्य भुजा/अंगूठे कोर के लिए प्रोसेसर से दूर चले जाते हैं।

असेंबलर आम तौर पर इन सभी निर्देशों को जोड़ने और चीजों को बनाने के अन्य तरीकों को उच्च स्तर की भाषा की तरह दिखने लगते हैं। मैं बस इतना कह रहा हूं कि आपको उनका उपयोग नहीं करना है, मैंने हाथों के लिए असेंबलरों को स्विच किया है और कई अलग-अलग प्रोसेसर के लिए कई अलग-अलग असेंबलरों का उपयोग किया है और कम से कम दृष्टिकोण है, जिसका अर्थ है असेंबली पर ध्यान केंद्रित करना और जितना संभव हो सके कुछ टूल विशिष्ट वस्तुओं का उपयोग करना। मैं आम तौर पर नियम नहीं अपवाद हूं, इसलिए आप संकलक आउटपुट उत्पन्न करने के निर्देशों (और दस्तावेज़ीकरण के साथ सत्यापित) को देखकर अधिक अक्सर उपयोग किए जाने वाले निर्देशों को समझ सकते हैं।

 
unsigned int one (unsigned int x) 
{ 
    return(x+1); 
} 


    .arch armv5te 
    .fpu softvfp 
    .eabi_attribute 20, 1 
    .eabi_attribute 21, 1 
    .eabi_attribute 23, 3 
    .eabi_attribute 24, 1 
    .eabi_attribute 25, 1 
    .eabi_attribute 26, 2 
    .eabi_attribute 30, 2 
    .eabi_attribute 18, 4 
    .file "bob.c" 
    .text 
    .align 2 
    .global one 
    .type one, %function 
one: 
    .fnstart 
.LFB0: 
    @ args = 0, pretend = 0, frame = 0 
    @ frame_needed = 0, uses_anonymous_args = 0 
    @ link register save eliminated. 
    add r0, r0, #1 
    bx lr 
    .fnend 
    .size one, .-one 
    .ident "GCC: (Sourcery G++ Lite 2010.09-50) 4.5.1" 
    .section .note.GNU-stack,"",%progbits 

मैं जब कोडांतरक साथ में हाथ और अंगूठे कोडांतरक या डेटा मिश्रण .align का उपयोग करते हैं, तो आप इस तरह के एक मंच के लिए कोडांतरक अपेक्षा करते हैं अंगूठे निर्देश के रूप में के रूप में स्पष्ट कुछ halfword सीमाओं और हाथ निर्देश दिए गए हैं पर पता करने के लिए शब्द सीमाओं पर गठबंधन। उपकरण हमेशा स्मार्ट नहीं होते हैं। छिड़कने के बारे में संकेत।

.text डिफ़ॉल्ट है, जो थोड़ा अनावश्यक है, लेकिन चोट नहीं पहुंचाता है। .text और .data मानक गुण (बांह के लिए विशिष्ट नहीं हैं) यदि आप अपने लक्ष्य पर रोम और रैम के संयोजन के लिए संकलित कर रहे हैं तो आप परवाह कर सकते हैं (आप अपने लिंकर स्क्रिप्ट के साथ क्या करते हैं इस पर निर्भर करता है) अन्यथा .text सबकुछ के लिए काम करेगा ।

। जाहिर है कि फ़ंक्शन का आकार उस निर्देश से शुरू होता है। असेंबलर इसे अपने आप नहीं समझ सकता है, इसलिए यदि इस कोड का आकार आपके कोड, लिंकर स्क्रिप्ट, डीबगर, लोडर के लिए महत्वपूर्ण है, तो जो कुछ भी सही होने की आवश्यकता है, अन्यथा आपको परेशान नहीं होना चाहिए। एक समारोह एक उच्च स्तरीय अवधारणा है वैसे भी असेंबलर के पास वास्तव में उनके आकार की घोषणा करने की आवश्यकता कम नहीं होती है। और सी कंपाइलर निश्चित रूप से परवाह नहीं करता है, यह केवल शाखा के लिए एक लेबल की तलाश में है और हाथ परिवार के मामले में यह अंगूठे कोड या आर्म कोड है जिसे ब्रांच किया जा रहा है।

यदि आप कोड के लंबे हिस्सों पर अपने तत्काल (एलडीआर आरएक्स, = 0x12345678) के साथ आलसी हैं तो आपको .pool निर्देश (एक नया समतुल्य समतुल्य) उपयोगी हो सकता है। यहां फिर से उपकरण बिना किसी शर्त शाखा के बाद इस डेटा को रखने के लिए पर्याप्त स्मार्ट नहीं होते हैं, आप कभी-कभी उन्हें बताते हैं। मैं आलसी आधा गंभीरता से कहता हूं, यह लेबल करने के लिए दर्दनाक है: हर समय .word चीज और मेरा मानना ​​है कि उस शॉर्टकट के लिए दोनों हाथ और जीसीसी उपकरण की अनुमति है, इसलिए मैं इसे किसी और के रूप में उपयोग करता हूं।

यह भी ध्यान दें कि llvm एक अतिरिक्त .eabi_attribute या दो को आउटपुट करता है जो कोड सॉर्केरी के संस्करण/मोड द्वारा binutils में समर्थित है लेकिन gnu रिलीज़ binutils द्वारा समर्थित (शायद अभी तक) समर्थित नहीं है। दो समाधान जो काम करते हैं, ev_attributes लिखने के लिए llvm के एएसएम प्रिंट फ़ंक्शन को संशोधित करते हैं या कम से कम उन्हें एक टिप्पणी (@) के साथ लिखते हैं, या कोड सॉर्केरी से binutils स्रोत/मोड प्राप्त करते हैं और इस तरह binutils का निर्माण। कोड सॉर्केरी gnu (उदाहरण के लिए thumb2 समर्थन) का नेतृत्व करता है या शायद नई सुविधाओं का समर्थन करता है, इसलिए मुझे लगता है कि ये llvm attrubutes लंबे समय से मुख्य लाइन binutils में उपस्थित होंगे। मुझे llvm संकलित कोड के eabi_attributes को बंद करके कोई बुरा प्रभाव नहीं पड़ा है।

ऊपर दिए गए एक ही कार्य के लिए llvm आउटपुट है, जाहिर है यह यह llc है जिसे मैंने eabi_attributes पर टिप्पणी करने के लिए संशोधित किया है।

 
    .syntax unified 
@ .eabi_attribute 20, 1 
@ .eabi_attribute 21, 1 
@ .eabi_attribute 23, 3 
@ .eabi_attribute 24, 1 
@ .eabi_attribute 25, 1 
@ .eabi_attribute 44, 1 
    .file "bob.bc" 
    .text 
    .globl one 
    .align 2 
    .type one,%function 
one:         @ @one 
@ BB#0:         @ %entry 
    add r0, r0, #1 
    bx lr 
.Ltmp0: 
    .size one, .Ltmp0-one 

योगिनी फ़ाइल स्वरूप अच्छी तरह से प्रलेखित है और यदि आप वास्तव में देखने के लिए योगिनी विशिष्ट निर्देशों (यदि हो तो) क्या कर रहे हैं चाहते हैं पार्स करने के लिए बहुत आसान है। इनमें से कई निर्देश लिंकर को किसी भी चीज़ से ज्यादा मदद करना है। उदाहरण के लिए .thumb_func, .text, .data।

+0

धन्यवाद, यह निश्चित रूप से मदद की। तो न तो .size और न ही .type जरूरी है जब तक कि हम एक विशेष मामले के बारे में बात नहीं कर रहे हैं? – Oystein

+0

मैंने कभी भी .size या .type का उपयोग नहीं किया है और मेरा अधिकांश काम एक हाथ पर है और असेंबलर हमेशा शामिल है। मुझे लगता है कि अगर आपकी लिंकर स्क्रिप्ट या लोडर/एल्फ पार्सर ऐसी चीजों को देखना चाहता है तो आपको वहां उनकी ज़रूरत है, मैं बहुत सरल लिंकर स्क्रिप्ट का उपयोग करता हूं जो वास्तव में केवल .text बनाम। डेटा, मूल रूप से रोम बनाम रैम के बारे में परवाह करता है। –

+0

.size निर्देश के बारे में: बायोनिक के लिए एंड्रॉइड गिट पेड़ में, fb723c87490b76d1d2fe521886f7cb6c96ed40b7 प्रतिबद्ध करें: BEGIN (x) और END (x) मैक्रोज़ के साथ एआरएम सिस्कोल को सिस्कल के कोड के लिए आकार जानकारी देने के लिए अपडेट करें। Valgrind के लिए उपयोगी। ' –

5

आपके प्रोग्राम के अनुभाग ईएलएफ प्रारूप से कड़े से जुड़े हैं जिसमें अधिकांश सिस्टम (लिनक्स, बीएसडी, ...) अपनी ऑब्जेक्ट और निष्पादन योग्य फ़ाइलों को संग्रहीत करते हैं। This article आपको ईएलएफ कैसे काम करता है, इस बारे में अच्छी जानकारी देनी चाहिए, जो आपको अनुभागों के कारण को समझने में मदद करेगी।

बस शब्दों में कहें, अनुभाग आपको अपने प्रोग्राम को विभिन्न मेमोरी क्षेत्रों में व्यवस्थित करने देते हैं जिनमें पते, निष्पादन और लिखने की अनुमति आदि सहित विभिन्न गुण होते हैं। अंतिम लिंक चरण के दौरान, लिंकर एक विशेष linker script का उपयोग करता है जो आमतौर पर सभी अनुभागों को समूहित करता है एक ही नाम के साथ (उदाहरण के लिए सभी संकलन इकाइयों से सभी कोड, ...) और उन्हें स्मृति में अंतिम पता असाइन करता है।

एम्बेडेड सिस्टम के लिए उनका उपयोग विशेष रूप से स्पष्ट है: पहला, बूट कोड (आमतौर पर .text अनुभाग में निहित) निष्पादित करने के लिए एक निश्चित पते पर लोड किया जाना चाहिए। फिर, केवल पढ़ने के लिए डेटा को एक समर्पित रीड-ओनली सेक्शन में समूहीकृत किया जा सकता है जिसे डिवाइस के रोम क्षेत्र में मैप किया जाएगा।अंतिम उदाहरण: ऑपरेटिंग सिस्टम में प्रारंभिक कार्य होते हैं जिन्हें केवल एक बार बुलाया जाता है और फिर बाद में कभी भी उपयोग नहीं किया जाता है, जो कि बहुमूल्य स्मृति स्थान को बर्बाद कर देता है। यदि इन सभी प्रारंभिक कार्यों को एक समर्पण खंड में एक साथ समूहीकृत किया गया है, तो कहें, .initcode, और यदि यह खंड प्रोग्राम का अंतिम भाग बनने के लिए सेट किया गया है, तो ऑपरेटिंग सिस्टम ऊपरी को कम करके प्रारंभ होने के बाद आसानी से इस स्मृति को पुनः प्राप्त कर सकता है अपनी याददाश्त की सीमा। उदाहरण के लिए लिनक्स है कि चाल का उपयोग करने के लिए जाना जाता है, और जीसीसी आप एक चर या विधि एक विशेष खंड में अभी भी काफी स्पष्ट नहीं मेरे लिए भी जगह __attribute__ ((section ("MYSECTION")))

.type और .size साथ यह postfixing द्वारा कर रहे हैं वास्तव में अनुमति देता है। मैं उन्हें लिंकर के लिए सहायक के रूप में देखता हूं और उन्हें कभी भी असेंबलर-जेनरेट कोड के बाहर नहीं देखा।

.thumb_func केवल पुराने ओएबीआई इंटरफ़ेस के लिए आवश्यक है ताकि आर्म कोड के साथ इंटरैक्टिंग की अनुमति दी जा सके। जब तक आप पुराने टूलचैन का उपयोग नहीं कर रहे हैं, तो आपको शायद इसके बारे में चिंता करने की ज़रूरत नहीं है।

+0

यह कम से कम अनुभाग भाग को साफ़ करता है, मुझे लगता है। क्या आपके अपने वर्गों को परिभाषित करने का कोई विशेष कारण है? – Oystein

+5

.thumb_func आवश्यक है यदि आप फ़ंक्शन का पता लेते हैं। थंब फ़ंक्शन के लिए, इसके पते में थोड़ा 0 सेट होना चाहिए (डेटा आइटम पता के विपरीत)। यह निर्देश असेंबलर को प्रतीक के रूप में चिह्नित करता है, और इस प्रकार लिंकर जानता है कि थोड़ा 0 सेट कब करें। –

+0

@ इगोर: बहुत बढ़िया! धन्यवाद – Oystein

5

मैं यह पता लगाने की कोशिश करते हुए आया कि एआरएम और थंब इंटरैक्टिव हालिया बिनुटिल्स (2.21.53 (मैकपॉर्ट्स) के साथ सत्यापित, 2.22 (यागार्टो 4.7.1)) के साथ क्यों टूट गया।

मेरे अनुभव से, .thumb_func सही इंटरवियर लिबास उत्पन्न करने के लिए पहले बिनटिल्स के साथ ठीक काम किया। हालांकि, हालिया रिलीज के साथ, .type *name*, %function उचित लिबास पीढ़ी सुनिश्चित करने के लिए निर्देश की आवश्यकता है।

binutils mailing list post

मैं भी अगर .type निर्देश पहले binutils के लिए .thumb_func के स्थान पर पर्याप्त है की जाँच करने के binutils के एक पुराने संस्करण की खुदाई करने के लिए आलसी हूँ।मुझे लगता है कि आपके कोड में दोनों निर्देशों को शामिल करने में कोई हानि नहीं है।

संपादित: कोड में .thumb_func के प्रयोग पर टिप्पणी अद्यतन, जाहिरा तौर पर यह ARM-> ध्वज को अँगूठा interworking अंगूठे दिनचर्या veneers उत्पन्न करने के लिए के लिए काम करता है, लेकिन Thumb-> एआरएम interworking में विफल रहता है जब तक कि .type निर्देश झंडा एआरएम लिए किया जाता है समारोह।

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