मैं कई वर्षों के असेंबलर के लिए प्रोग्रामिंग आर्म/थंब प्रोग्रामिंग कर रहा हूं और वहां कई निर्देशों की बहुत कम आवश्यकता है।
.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।
मैंने विशेष रूप से .type और .size निर्देशों के बारे में अधिक विस्तृत उत्तर प्राप्त करने की उम्मीद में प्रश्न के लिए एक बक्षीस जोड़ा है। – Oystein
इसे प्रति निर्देश एक प्रश्न में विभाजित किया जाना चाहिए। सलाह: ईएलएफ प्रारूप को समझें, फिर प्रत्येक निर्देश के साथ और उसके बिना न्यूनतम उदाहरण बनाएं, संकलित करें और उन पर 'readelf -a'। –