मेरा उत्तर आम तौर पर है ... एक डिस्सेबलर लिखें। आपने एआरएम पर छू लिया है, शायद आप सभी एआरएम निर्देशों को जानते हैं, शायद नहीं, अंगूठे के बारे में क्या? एआरएम इस विधि के साथ सीखने के लिए एक अच्छा है, दोनों लोकप्रिय और निश्चित निर्देश लंबाई, ताकि आप शुरुआत से अंत तक रैखिक रूप से अलग हो सकें।
मेरा मतलब यह नहीं है कि एक पॉलिश सोर्सफोर्ज योग्य डिस्सेबलर लिखें, शायद एक समय में अधिकतम 5 या 10 लाइनें असेंबलर लिखें, अधिकतम, शायद अलग-अलग रजिस्टरों के साथ एक ही निर्देश, बस बाइनरी को थोड़ी देर के साथ पार्स करने के लिए पर्याप्त पेड़ या स्विच।
add r0,r0,#1
add r0,r1,#1
add r0,r2,#2
अपने लक्ष्य, opcode में प्रत्येक बिट की जांच को समझने के लिए कारण है कि आप केवल 8 बिट immediates है, समझ में क्यों कुछ प्रोसेसर केवल आप एक स्थानीय सशर्त शाखा के लिए 127 या 128 बाइट्स कूद कर सकते हैं है। ऐसा करने के लिए आपको एक डिस्सेबलर लिखना नहीं है, लेकिन मेरे लिए यह जानकारी मेरे दिमाग में एम्बेड करने के लिए काम करता है।
डिस्सेबलर का परीक्षण करने के लिए सभी संभावित ऑपकोड/निर्देश बनाने के लिए, आप जिस असेंबलर का उपयोग कर रहे हैं उसके लिए सभी सिंटैक्स बारीकियों को सीखना समाप्त कर देते हैं। चिप कंपनियों की किताब में असेंबली भाषा जरूरी नहीं है कि प्रोसेसर परिवार के लिए प्रत्येक असेंबलर द्वारा उपयोग किया जाने वाला सटीक वाक्यविन्यास। एमआरसी/एमसीआर निर्देश (एआरएम) इसका एक अच्छा उदाहरण हैं। विशेष रूप से गैस को भयानक नौकरी के लिए जाना जाता है जो सिंटैक्स को बदलता है, जिससे चिप कंपनियां सिंटैक्स और टूल्स की तुलना में इसे अधिक दर्दनाक बना दिया जाता है। यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं, अगर आप कुछ लाइनों को कोड करना चाहते हैं या कुछ संशोधित करना चाहते हैं, तो आपको हर कोने केस या असेंबलर सुविधा को जानने की आवश्यकता नहीं है, लेकिन यदि आप वास्तव में निर्देश सेट सीखना चाहते हैं तो मैं इस दृष्टिकोण की अनुशंसा करता हूं ।
मैं मुख्य रूप से सी का उपयोग कर एक एम्बेडेड सॉफ़्टवेयर इंजीनियर हूं, लेकिन आउटपुट की जांच करने वाले दैनिक (ओजडम्पम्प का उपयोग करके, मेरे उपकरण नहीं), यह सुनिश्चित करने के लिए कि यह कोड इस मेमोरी क्षेत्र में है और यह कोड यहां लिंकर सामान है। लेकिन मुझे कभी-कभी प्रोसेसर/चिप के सिमुलेशन की जांच करनी पड़ती है और अनुकरण के माध्यम से कोड का पालन करने के लिए निर्देश प्राप्त करने और उनके संबंधित I/O का पालन करने की आवश्यकता होती है। या राम या किसी अन्य बस पर एक तर्क विश्लेषक के साथ एक बोर्ड डीबगिंग। मैंने कई अलग-अलग प्रोसेसर, 8, 16, 32, 64 बिट, (और उस सूची में पंजीकरण की लंबाई वाले लोगों को नहीं सीखा है) सिस्क, रिस्क, डीएसपी और कुछ माइक्रोइंजिन। उनमें से प्रत्येक के लिए एक डिस्सेबलर लिखा है (अच्छी तरह से पीडीपी 11 और x86 को छोड़कर, मेरे पहले दो निर्देश सेट), एक बार आप उनमें से कुछ को देखने के बाद एक नया आईएसए सीखने के लिए लेते हैं। नहीं, मेरे लिए एक या दो दिन से स्विच करने में एक दिन लग रहा है, मैं दिन/सप्ताह/महीनों के लिए दैनिक उपयोग कर रहा हूं, मैंने महीनों/वर्षों में उपयोग नहीं किया है। मैं एक ही समय में सभी भाषाओं में नहीं सोचता।
वैरिएबल लम्बाई निर्देशों (वहां से अधिकांश प्रोसेसर) को अलग करना, वास्तव में इसे सही करना, एक कला रूप है और जिस तरीके से मैं बात कर रहा हूं उससे परे, यही कारण है कि मैं एक समय में केवल कुछ हद तक निर्देशों की अनुशंसा करता हूं , उन निर्देशों में डेटा एम्बेड न करें। आदर्श रूप से इस विधि का उपयोग करें यदि आपके पास एक काम करने वाला/अच्छा डिस्सेबलर आसान है, तो आप अपने आउटपुट की तुलना वास्तविक रूप से परीक्षण और डीबग किए गए डिस्सेबलर से कर सकते हैं।
अगर आप वास्तव में उत्सुक हैं, तो विसर्जित होने से परे, एक एमुलेटर लिखना एक अच्छा अभ्यास है, फिर मैं जांच के बजाय लिखता हूं। कई कोरों में अनुकरणकर्ता होते हैं, और आप स्वयं को लिखने के बजाय उनकी जांच कर सकते हैं, मेरे लिए क्या काम करता है आपके लिए काम नहीं कर सकता है। मैंने केवल इनमें से कुछ लिखा है। यह दोपहर का प्रोजेक्ट नहीं है, लेकिन आपको यह समझने में मदद मिलती है कि प्रोसेसर परिवार कैसे काम करता है।
जो भी सीखने का माहौल आपके लिए सबसे अच्छा है, चाहे वह एक गुई आधारित आईएसए सिम्युलेटर, किताबें, वेब पेजों के माध्यम से अलग-अलग कदम उठाएं। एक या कई प्रोसेसर के लिए असेंबलर सीखना निश्चित रूप से आपके उच्च स्तरीय प्रोग्रामिंग को बेहतर बना देगा। यहां तक कि यदि आप वास्तव में कभी भी असेंबलर नहीं लिखते हैं, लेकिन केवल इसकी जांच करें। कुछ सी कोड लिखें जो सरणी और पॉइंटर्स और संरचनाओं का उपयोग करते हैं और संरचनाओं, लूप, अनियंत्रित लूप के बिना, इनमें से प्रत्येक को विभिन्न कंपाइलर विकल्पों के साथ संकलित करते हैं, बिना किसी ऑप्टिमाइज़ेशन के, अधिकतम/आक्रामक अनुकूलन के साथ, डीबगर सामग्री सक्षम किए बिना। (विभिन्न प्रोसेसर के लिए संकलित करें और कार्यक्रम प्रवाह में अंतरों की तुलना करें, निर्देशों की संख्या इत्यादि। llvm इसके लिए बहुत अच्छा है)।
अपने उच्च (एआर) स्तर कोडिंग को बेहतर बनाने के अलावा आप यह भी सीखते हैं कि कौन से कंपाइलर्स अच्छे और बुरे और औसत हैं। क्या जीई व्हिज सिंटैक्स आपको कुछ मानक का हिस्सा होने पर भी टालना चाहिए, और अधिकांश कंपाइलर्स का सिंटैक्स सही क्यों होता है। मैं अत्यधिक अनुशंसा करता हूं कि आप जितने अलग-अलग कंपाइलर्स कर सकें।
मैं एकदम अलग परिवारों देखने की अनुशंसा करते हैं, कोई/कम आंतरिक प्रजनन करने वाले ही मैं एआरएम/अंगूठे (और thumb2) जो निश्चित रूप से सहज है, लेकिन लोकप्रिय हैं और इसलिए आप अपने खाली समय में दूसरों को सीख सकते हैं बिलों का भुगतान होगा उल्लेख किया । 6802 या 68 एचसी 11, 8088 और/या z80 पर वापस जाएं। पुरानी तस्वीर pic12, या pic16 (pic32 सिर्फ एक mips है)। मिप्स, पावर पीसी, एवीआर। मैं msp430 निर्देश के विशाल प्रशंसक हूं, सीखने के लिए बहुत अच्छा एक सेट है, एक पीडीपी 11 महसूस किया है, कंपाइलर दोस्ताना, दुखद रूप से एक आला बाजार पर लक्षित है। 8051, अभी भी आश्चर्यजनक नहीं है, अभी भी मर चुका है। पुराने, उनमें से अधिकतर, निर्देशों को विभिन्न रूपों में सिमुलेटर सेट करते हैं (उदाहरण के लिए मैम में कई हैं), ताकि आप उन सिमुलेटर ले सकें और स्मृति और रजिस्टरों को प्रिंट कर सकें क्योंकि आपका प्रोग्राम देखने और सीखने और सुधारने के लिए निष्पादित होता है। फिर उन पुराने लोगों की तुलना अधिक आधुनिक लोगों के साथ करें। देखें कि क्यों एक ही घड़ी दर पर कुछ आईएसए दूसरों को छलांग और सीमा से बेहतर प्रदर्शन करते हैं, कुछ में एक एकल संचयक, एक रजिस्टर, शायद दो या चार होता है, और कुछ भी उपयोगी करने के लिए आपको लगातार लोड और स्टोर करना होता है, एक वास्तविक ऑपरेशन के लिए कई निर्देश लेते हैं । जहां विशेष उद्देश्य रजिस्टरों के बजाय अधिक रजिस्ट्रार या जेनेरिक रजिस्ट्रार होने के कारण, एक या दो या तीन निर्देश/घड़ियों में वास्तविक ऑपरेशन कुछ और आधुनिक है।
एक उन्नत विषय मेमोरी एक्सेस है। अंगूठे (thumb2 नहीं) एआरएम के रूप में उतना कुशल नहीं है, एक ध्यान देने योग्य ओवरहेड है, एक ही कार्य के लिए 5-10% अधिक निर्देश आवश्यक है, तो गेमबॉय एडवांस पर अंगूठे काफी तेज क्यों है? उत्तर, गैर-शून्य प्रतीक्षा राज्य स्मृति के साथ ज्यादातर 16 बिट मेमोरी बसें। जीबीए में कैश नहीं है, लेकिन रोम इंटरफ़ेस पर प्रीफेच डील है और रोम टाइमिंग गैर-रैखिक है, पहले एन एन घड़ियों को पढ़ा जाता है और अनुक्रमिक पते से पढ़ता है जो एम घड़ियों (एम से कम है) (जो कि रैम से रोम को तेजी से निष्पादित करता है)। यह नहीं जानते कि इस मंच और दूसरों के लिए आपके एम्बेडेड प्रोग्राम की सफलता और विफलता के बीच अंतर हो सकता है। असेंबली भाषा समझ से परे रास्ता जाता है, लेकिन आप कंपाइलर के आउटपुट को पढ़ने और समझने में सक्षम होने के बिना वहां नहीं पहुंच सकते हैं।
एक और उन्नत विषय कैश है। यदि आपके पास कैश के साथ कुछ पहुंच है और इसे बंद कर सकते हैं (गेमपार्क से कुछ कहें तो एक gp32 या wiz, एक पुराना आइपॉड जिसे आप होमब्री कर सकते हैं) आदि। आदर्श रूप से आप कुछ निर्देश और डेटा कैश को अलग-अलग नियंत्रित कर सकते हैं । आपको पूरी तरह से अनुकूलन के लिए अनुभव मिलता है, यह अब सबसे कम कूद/शाखाओं के साथ सबसे कम निर्देशों के बारे में नहीं है, और सबसे कम स्मृति उपयोग करता है। अब आपको कैश लाइन की लंबाई से निपटना होगा, जहां निर्देश उस कैश लाइन के भीतर उतरते हैं। किसी प्रोग्राम की शुरुआत में एक, दो, तीन, कभी-कभी अधिक नॉप जोड़ना (वास्तव में, सचमुच प्रारंभ में एक एनओपी जोड़ना नहीं।) नाटकीय रूप से उसी (उच्च स्तर) स्रोत, कंपाइलर द्वारा उत्पन्न प्रोग्राम के प्रदर्शन को नाटकीय रूप से सुधार या बर्बाद कर सकता है , और अनुकूलन सेटिंग्स। निर्देशों की जांच करनी चाहिए और हार्डवेयर को समझने के लिए क्यों समझना चाहिए।
आपके प्रश्नों विशेष रूप से:
विधानसभा भाषाओं में कोडिंग (किसी भी) में
-People के अनुभव, जो वे विधानसभा भाषा में कोडिंग के वर्षों में प्राप्त की है।
नई विधानसभा भाषा
ऊपर देखें सीखने जबकि ध्यान में रखने के ऊपर
-Guidelines देखते हैं। मान लें कि प्रोसेसर अलग से अलग हैं, वे रजिस्टरों को लोड और स्टोर करते हैं, शाखा बिना शर्त और सशर्त रूप से। सशर्त शाखाओं के एक ही मुट्ठी भर अच्छी तरह से जाना जाता है और इस्तेमाल किया जाता है। पहले सामान्य निर्देशों की तलाश करें, तुरंत लोड करें, एक रजिस्टर से दूसरे में स्थानांतरित करें, रजिस्टर एड, और, या xor पंजीकृत करें।सभी प्रोसेसर के पास विभाजन निर्देश नहीं है, अधिकतर नहीं, कुछ में गुणा नहीं होता है, आपके विचार से ज्यादा। और अधिकतर आप सामान्य रूप से उपयोग नहीं कर सकते हैं, यदि एक गुणा के संचालन और परिणाम सभी समान आकार रजिस्टर हैं, तो परिणाम के कई संयोजन परिणाम बहेंगे।
विशिष्ट युक्तियाँ और चालें विधानसभा भाषाओं में कुशलता से और सही ढंग से कोड करने के लिए सड़क के बीच नीचे
ड्राइव, एक भाषा के इस कोडांतरक/संकलक, या जी विशेषज्ञ सुविधाओं के लिए विशिष्ट शांत चाल में नहीं है। इसे सरल रखें, मेरे कुछ 20 वर्षीय सी कोड आज भी कई कंपाइलरों पर संकलित हैं। मुझे अक्सर दुनिया में कुछ साल या उससे कम पुराना कोड मिलता है जो आज संकलित नहीं होता है, इसे कंपाइलर या भाषा चाल के कारण, नए कंपाइलर्स के साथ एक ही कार्य करने के लिए लगातार बनाए रखा जाना चाहिए।
-कैसे कुशलता से एक इष्टतम विधानसभा कोड
प्रारंभ सी या अन्य के साथ में दिए गए सी कोड में परिवर्तित करने, और संकलन और एकत्रित न, हो सकता है अनुकूलन के कुछ स्तर, शायद कुछ अलग compilers। फिर बस समस्याओं को ठीक करें। यह एक मजेदार काम है, लेकिन वास्तव में आप उस जीई जाल में फंस जाते हैं। अक्सर, 5 या 10 या 20 में से 1 या 2 या 7 निर्देशों को सहेजना सी के साथ असेंबलर को ले जाने और आपको एक पोर्टेबल स्थिति में रखने या किसी परिस्थिति में जहां संकलक पकड़ सकता है अगला संस्करण या दो, और यहां तक कि आपकी क्षमताओं से भी अधिक है क्योंकि वे अधिक निर्देशों को जानते हैं और आपके द्वारा उपयोग किए जाने से उनका उपयोग कैसे करें।
जहां मैं असेंबलर का उपयोग करता हूं (स्वाभाविक रूप से बूट करने के अलावा) वास्तव में रजिस्ट्रार या मेमोरी स्थानों को पढ़ने और लिखने के लिए है। मेरे द्वारा उपयोग किए जाने वाले प्रत्येक कंपाइलर में एक समय पर सही निर्देश प्राप्त करने में असफल रहा, 32 बिट स्टोर को 8 बिट के साथ बदल दिया गया, उस तरह की चीज। मैं वास्तव में संकलक को बीमा करने के लिए असेंबलर में चोटी और पोक दिनचर्या को लागू करने के लिए निर्देश और घड़ियों को बर्बाद करता हूं। मेमोरी प्रतियां और ऐसी चीजें आम तौर पर वास्तव में अच्छी होती हैं (सी पुस्तकालयों में), लेकिन ऐसे स्थान हैं जहां आप एक निर्देश सेट का लाभ उठा सकते हैं। विशिष्ट निर्देशों का लाभ लेना जो आप जिस भाषा का उपयोग कर रहे हैं उसका हिस्सा नहीं हैं, बिट टेस्ट या बिट सेट (कि संकलक पहचान/अनुकूलन नहीं करता है)। बाइट स्वैपिंग यदि आपके पास बाइट या आधावर्ड स्वैप निर्देश है। कुछ घुमाने या बदलाव या साइन एक्सटेंशन।
यदि आप इसे पा सकते हैं, तो यह ब्लैक बुक, माइकल एब्रैश, असेंबली भाषा के जेन के हिस्से के रूप में मुफ्त में बाहर है। निष्पादन समय और परीक्षण, परीक्षण, परीक्षण का आकलन करें। इससे कोई फर्क नहीं पड़ता कि आप कितने अच्छे हैं कि आप स्टॉपवॉच असली विजेता दिखाएंगे। हार्डवेयर ने अपनी आधे शिक्षाओं को समाप्त कर दिया है, लेकिन विचार प्रक्रिया, और विस्तार के उस स्तर पर कोड की जांच करने की गहराई (मेरे पास प्रिंट बीटीडब्लू में मूल पुस्तक है), बाद में पत्रिका लेख सुपर स्केलर प्रोसेसर में गए और बस पुनः व्यवस्थित कुछ निर्देश इसलिए उन्हें पहचानने और समझने के लिए अलग-अलग निष्पादन इकाइयों को अलग-अलग निर्देशों को निष्पादित करने के लिए कई बार तेजी से निष्पादित किया जा सकता था। यहां फिर से इसमें से अधिकांश को पाइपलाइनों, अधिक निष्पादन इकाइयों, समांतर प्रसंस्करण, तेज घड़ियों द्वारा शोर में दफनाया गया है। असल में यह भयानक प्रोग्रामिंग भाषाओं का नतीजा है जो इतने अक्षम हैं कि हार्डवेयर को क्षतिपूर्ति करना है। लेकिन यह हमारे लिए और भी मजेदार बनाता है जब हम अपने साथियों के मुकाबले हजारों गुना तेजी से एक ही ऑपरेशन कर सकते हैं।
हालांकि इस गतिविधि के साथ पैर में खुद को शूट करना बहुत आसान है (असेंबलर के साथ सी आउटपुट में सुधार), सावधानी के साथ आगे बढ़ें। आपको चेतावनी दी गई है।
-कैसे स्पष्ट रूप से किसी दिए गए विधानसभा कोड
व्यायाम की बात है कि समझने के लिए। यदि आप अपना स्वयं का असेंबलर लिख रहे हैं और सड़क के बीच में गाड़ी चला रहे हैं तो लोकप्रिय निर्देशों का एक सबसेट है, पढ़ने में आसान है, लिखना आसान है, आप उन्हें अच्छी तरह से जानते हैं।आप कंपाइलर जेनरेट किए गए निर्देश लेते हैं और उन्हें जांचने का प्रयास करते हैं, यह कठिन है, डिस्सेबलर जेनरेट किए गए कोड के रूप में मदद/समस्या जितना अधिक है। असेंबलर या मशीन कोड में हाथ से लिखे पुराने स्कूल गेम रोम को भी कठिन बनाएं।
-कैसे एक रजिस्टरों का ट्रैक जो उस में ऑपरेंड होगा, ढेर सूचक, कार्यक्रम काउंटर, कैसे अंतर्निहित संरचना और संसाधनों यह एक प्रोग्रामर के लिए प्रदान करता है, आदि को समझने में करीब रखने करता है ..
यह अक्सर असेंबलर से बाहर होता है, आपको पाइपलाइन, प्रीफेचिंग, शाखा छाया, कैश, लिखने वाले बफर, मेमोरी बसेस, प्रतीक्षा चक्रों को समझना होता है।
आप जो वास्तव में यहां पूछ रहे थे उसके आधार पर एक और जवाब यह है कि कंपाइलर्स कॉलिंग कन्वेंशन को जानना है, आर 0, आर 1, आर 2 में संग्रहीत फ़ंक्शन के लिए ऑपरेंड हैं ... और यदि ऐसा है तो वे रजिस्टरों में कितने हैं ढेर। क्या यह कंपाइलर स्टैक पर सब कुछ डालता है? क्या ढेर पर ढेर झंडे भी हैं? वापसी पता कहां संग्रहीत किया जाता है? यह पुराने लक्ष्य में (xortech/Watcom बनाम माइक्रोसॉफ्ट/बोर्लैंड), या उसी कंपाइलर के लिए उसी प्रोसेसर के लिए उसी समय के लिए अलग-अलग कंपाइलर्स द्वारा भिन्न हो सकता है जैसा कि हम आधुनिक समय (एबीआई और ईएबीआई) में देखते हैं। आधुनिक समय आपको एक इंटरफ़ेस मिल सकता है जिसे किसी (चिप कंपनी स्वयं?) द्वारा डिजाइन और परिभाषित किया गया है और विभिन्न कंपाइलर्स विभिन्न कारणों, पोर्टेबिलिटी, मार्केटिंग, आलस्य आदि के लिए उस मानक को पूरा करेंगे। मुझे डिस्सेप्लिब्स की जांच करना और बीच में ड्राइव करना जिस सड़क पर आप जाने और पढ़ने के बिना कॉलिंग सम्मेलनों को समझ सकते हैं।
मैंने अपने साथियों की परेशानी के लिए जल्दी और अक्सर असेंबली भाषा सीखी, मैं अपने सी में जेनेरिक चर का पुन: उपयोग करता हूं जैसे कि मैं असेंबलर लिख रहा था। तो इस बात का ट्रैक रखना कि प्रोग्राम में किस समय पर चरम है, मेरे लिए प्राकृतिक आदत है। YMMV। किसी एल्स असेंबलर या कंपाइलर आउटपुट का विश्लेषण करते समय मैं पाठ संपादक के भीतर उस आउटपुट को हैक कर दूंगा जिसे मैं इसे पढ़ने के लिए उपयोग कर रहा हूं। दृश्य रिक्त स्थान, कार्यात्मक ब्लॉक के बीच खाली रेखाएं, प्रत्येक निर्देश के बाद टिप्पणियां बनाने के लिए टिप्पणियां जो अब रजिस्टर में हैं, आर 0 में एक तालिका में इंडेक्स नंबर है, आर 1 अब तालिका में उस आइटम का ऑफसेट शब्द रखता है, आर 0 अब रखता है तालिका में उस आइटम का भौतिक पता, आर 2 अब आइटम को तालिका से ही रखता है, आदि
शुभकामनाएं, मज़ा लें, वास्तव में लंबे उत्तर के लिए खेद है।
यदि आप समझाया * क्यों * आप यह करना चाहते हैं तो यह मदद कर सकता है? एचएलएल का उपयोग करने की तुलना में आप असेंबली प्रोग्रामिंग में क्या लाभ प्राप्त करते हैं? और क्या इन कथित फायदे वास्तव में असेंबली कार्यक्रमों के विकास और रखरखाव की अत्यधिक बढ़ी हुई लागत से अधिक हैं? –
@ पॉल आर: काम पर मैं एक प्रोसेसर प्रोग्रामिंग पर काम करने जा रहा हूं जो सिमड और वीएलडीडब्ल्यू है, और कंपाइलर, जो इस आर्किटेक्चर के लिए इनहाउस किया गया है, अच्छा काम नहीं करता है। हाथ-कोडित असेंबली की तुलना में उस आर्किटेक्चर के लिए लगभग 4x-6x बार अक्षम कोड जनरेशन। इसीलिए। – goldenmean
उस मामले में, असेंबलर लिखने में बहुत सारे प्रयासों को निवेश करने के बजाय, आपको अधिक से अधिक ROI प्राप्त करना चाहिए यदि आप संकलक –