मैंने कई बार ऐसा किया है और यह करना जारी रखता हूं। इस मामले में जहां आपका प्राथमिक लक्ष्य पढ़ रहा है और कोडांतरक नहीं लिख रहा है, मुझे लगता है कि यह लागू होता है।
अपने खुद के disassembler लिखें। अगले महान डिस्सेम्बलर बनाने के उद्देश्य से नहीं, यह आपके लिए कड़ाई से है। लक्ष्य निर्देश सेट सीखना है। चाहे मैं एक नए मंच पर कोडांतरक सीख रहा हूं, एक बार मैं एक मंच के लिए कोडांतरक को याद कर रहा हूं। कोड की केवल कुछ पंक्तियों के साथ शुरू करें, उदाहरण के लिए रजिस्टर जोड़ते हैं, और बाइनरी आउटपुट को डिसाइड करने और इनपुट साइड पर अधिक से अधिक जटिल निर्देशों को जोड़ने के बीच पिंग-इंग पिंग करते हैं:
1) विशिष्ट प्रोसेसर के लिए निर्देश सेट सीखें
2) उक्त प्रोसेसर के लिए कोड को कैसे लिखना है, इसकी बारीकियों को जानें, ताकि आप हर निर्देश में हर ओपोड बिट को विघटित कर सकें
3) आप सीखे हुए निर्देश को बेहतर तरीके से सीखते हैं, जो अधिकांश इंजीनियर उस अनुदेश का उपयोग अपने जीवनयापन के लिए करते हैं
आपके मामले में कुछ समस्याएं हैं, मैं आमतौर पर एआरएम निर्देश को शुरू करने के लिए सेट करने की सलाह देता हूं, किसी भी अन्य (x86 कंप्यूटर शामिल) की तुलना में आज अधिक एआरएम आधारित उत्पाद हैं। लेकिन संभावना है कि आप अब एआरएम का उपयोग कर रहे हैं और न ही इसके लिए पर्याप्त कोडांतरक जानते हैं कि स्टार्टअप कोड लिखने के लिए या एआरएम को जानने वाले अन्य रूटीन आपकी मदद कर सकते हैं या नहीं। एआरएम के लिए दूसरा और अधिक महत्वपूर्ण कारण पहले है क्योंकि निर्देश लंबाई निश्चित आकार और संरेखित हैं। X86 जैसी परिवर्तनशील लंबाई के निर्देशों को खारिज करना आपकी पहली परियोजना के रूप में एक बुरा सपना हो सकता है, और यहां लक्ष्य एक अनुसंधान परियोजना बनाने के लिए निर्धारित निर्देश नहीं सीखना है। तीसरा एआरएम एक अच्छी तरह से किया गया निर्देश सेट है, रजिस्टर समान बनाए जाते हैं और न ही व्यक्तिगत विशेष बारीकियां होती हैं।
इसलिए आपको यह पता लगाना होगा कि आप किस प्रोसेसर से शुरुआत करना चाहते हैं। मैं msp430 या ARM को पहले सुझाव देता हूं, फिर ARM को पहले या दूसरे को फिर x86 की अराजकता को। कोई फर्क नहीं पड़ता कि क्या प्लेटफॉर्म, किसी भी प्लेटफ़ॉर्म का उपयोग करने वाले किसी भी प्लेटफ़ॉर्म पर डेटा शीट या प्रोग्रामर संदर्भ पुस्तिका हैं जो विक्रेता से मुक्त हैं, जिसमें निर्देश सेट के साथ-साथ ऑपकोड (मशीन भाषा के बिट्स और बाइट्स) की एन्कोडिंग भी शामिल है। संकलक क्या करता है और कोड लिखने के लिए सीखने के उद्देश्य से संकलक को इसके साथ संघर्ष करना पड़ता है, कुछ निर्देश सेट जानने के लिए अच्छा है और देखें कि प्रत्येक संकलक के साथ प्रत्येक संकलक के साथ प्रत्येक निर्देश सेट पर समान उच्च स्तरीय कोड कैसे लागू किया जाता है। स्थापना। आप अपने कोड को अनुकूलित करने के लिए केवल यह जानना चाहते हैं कि आपने इसे एक कंपाइलर / प्लेटफॉर्म के लिए बेहतर बनाया है, लेकिन हर दूसरे के लिए बहुत खराब है।
ओह, चर लंबाई निर्देश सेटों को डिसाइड करने के बजाय, बस शुरुआत में शुरू करने और हर चार बाइट शब्द को बेतरतीब ढंग से मेमोरी के माध्यम से असंतुष्ट करने के रूप में आप एआरएम या हर दो बाइट्स जैसे msp430 (msp430) वेरिएबल लेंथ निर्देश के साथ प्राप्त कर सकते हैं, लेकिन आप अभी भी प्राप्त कर सकते हैं यदि आप रुकावट वेक्टर तालिका से प्रवेश बिंदुओं पर शुरू करते हैं तो मेमोरी के माध्यम से रैखिक रूप से जा रहे हैं)। वेरिएबल लेंथ के लिए आप एक वेक्टर टेबल पर आधारित एंट्री पॉइंट पाना चाहते हैं या प्रोसेसर बूट के बारे में ज्ञान और निष्पादन क्रम में कोड का पालन करना चाहते हैं। आपको प्रत्येक निर्देश को पूरी तरह से यह जानने के लिए डिकोड करना होगा कि कितने बाइट्स का उपयोग किया गया है, यदि निर्देश बिना शर्त शाखा नहीं है तो अगली बाइट मान लें कि निर्देश एक और निर्देश है। आपको सभी संभावित शाखा पते भी स्टोर करने होंगे और यह मान लेना होगा कि अधिक निर्देशों के लिए शुरुआती बाइट पते हैं। एक बार जब मैं सफल हुआ तो मैंने बाइनरी के माध्यम से कई पास किए। प्रवेश बिंदु पर शुरू करके मैंने उस बाइट को एक निर्देश की शुरुआत के रूप में चिह्नित किया और फिर बिना शर्त शाखा को मारने तक मेमोरी के माध्यम से रैखिक रूप से डिकोड किया। सभी शाखा लक्ष्यों को एक निर्देश के पते के रूप में टैग किया गया था। जब तक मुझे कोई नया शाखा लक्ष्य नहीं मिला, मैंने बाइनरी के माध्यम से कई पास किए। यदि किसी समय आपको 3 बाइट निर्देश मिलते हैं, लेकिन किसी कारण से आपने एक निर्देश के रूप में दूसरे बाइट को टैग किया है तो आपको समस्या है। यदि कोड एक उच्च स्तरीय संकलक द्वारा उत्पन्न किया गया था, तो यह तब तक नहीं होना चाहिए जब तक संकलक कुछ बुराई नहीं कर रहा हो, यदि कोड में हाथ से लिखा कोडांतरक है (जैसे एक पुराना आर्केड गेम) तो यह बहुत संभव है कि सशर्त शाखाएं होंगी जो कभी भी r0 = 0 की तरह नहीं हो सकती हैं, जिसके बाद शून्य नहीं होगा। जारी रखने के लिए आपको बाइनरी से उन लोगों को संपादित करना पड़ सकता है। आपके तात्कालिक लक्ष्यों के लिए जो मुझे लगता है कि x86 पर होगा मुझे नहीं लगता कि आपको कोई समस्या होगी।
मैं gcc टूल्स की सलाह देता हूँ, x86 आपका लक्ष्य है, तो mingw32 विंडोज पर gcc टूल्स का उपयोग करने का एक आसान तरीका है। यदि नहीं mingw32 प्लस msys, Binutils और gcc स्रोतों (आमतौर पर बहुत आसान) से क्रॉस कंपाइलर बनाने के लिए एक उत्कृष्ट मंच है। mingw32 के साइबरविन पर कुछ फायदे हैं, जैसे काफी तेज प्रोग्राम और आप साइबरविन डीएल नरक से बचते हैं। gcc और binutils आपको C या असेंबलर में लिखने और आपके कोड को अलग करने की अनुमति देगा और इससे अधिक वेब पेज हैं जो आपको दिखा सकते हैं कि आप किसी एक या सभी तीनों को कैसे कर सकते हैं। यदि आप एक चर लंबाई अनुदेश सेट के साथ ऐसा करने जा रहे हैं, तो मैं आपको एक उपकरण सेट का उपयोग करने की सलाह देता हूं जिसमें एक disassembler शामिल है। उदाहरण के लिए x86 के लिए एक तृतीय पक्ष disassembler एक चुनौती के रूप में उपयोग करने जा रहा है जैसा कि आप वास्तव में कभी नहीं जानते हैं कि यह सही ढंग से disassembler है। इसमें से कुछ ऑपरेटिंग सिस्टम पर निर्भर है, लक्ष्य एक द्विआधारी प्रारूप के लिए मॉड्यूल संकलित करना है जिसमें डेटा से सूचना अंकन निर्देश शामिल हैं ताकि डिस्सेम्बलर अधिक सटीक काम कर सके। इस प्राथमिक लक्ष्य के लिए आपकी अन्य पसंद एक उपकरण है जो सीधे आपके निरीक्षण के लिए कोडांतरक के लिए संकलित कर सकता है, फिर आशा करता है कि जब यह एक द्विआधारी प्रारूप को संकलित करता है तो यह समान निर्देश बनाता है।
लघु (ठीक थोड़ा छोटा) आपके प्रश्न का उत्तर देता है। एक निर्देश सेट जानने के लिए एक डिस्सेम्बलर लिखें। मैं आरआईएससीवाई के साथ शुरू करूँगा और एआरएम की तरह सीखना आसान होगा। एक बार जब आप जानते हैं कि एक निर्देश सेट दूसरों को लेने में बहुत आसान हो जाता है, तो अक्सर कुछ घंटों में, तीसरे निर्देश सेट से आप वाक्य रचना के लिए डेटाशीट / संदर्भ पुस्तिका का उपयोग करके लगभग तुरंत कोड लिखना शुरू कर सकते हैं। उपयोग करने के लायक सभी प्रोसेसर्स में एक डेटशीट या संदर्भ पुस्तिका होती है जो बिटकॉइन और ऑप्सोड्स के निर्देशों का वर्णन करती है। एआरएम जैसे आरआईएससी प्रोसेसर और एक्स 86 जैसे सीआईएससी के अंतर को जानने के लिए पर्याप्त है, चीजों के लिए रजिस्टरों से गुजरना या कम या बिना रजिस्टरों के साथ मेमोरी पर सीधे ऑपरेशन करने में सक्षम होने जैसी चीजें। तीन ऑपरेंड निर्देश बनाम दो, आदि जैसे आप अपने उच्च स्तरीय कोड को ट्यून करते हैं, एक से अधिक प्रोसेसर के लिए संकलन करें और आउटपुट की तुलना करें। सबसे महत्वपूर्ण बात जो आप सीखेंगे, वह यह है कि संकलक की गुणवत्ता को लिखे जाने वाले उच्च स्तर का कोड कितना भी अच्छा क्यों न हो, और किए गए अनुकूलन विकल्प वास्तविक निर्देशों में बहुत अधिक अंतर करते हैं। मैं llvm और gcc (binutils के साथ) की सलाह देता हूं, न ही उत्पादनमहान कोड, लेकिन वे बहु मंच और बहु लक्ष्य हैं और दोनों में ऑप्टिमाइज़र हैं। और दोनों स्वतंत्र हैं और आप विभिन्न लक्ष्य प्रोसेसर के लिए स्रोतों से आसानी से क्रॉस कंपाइलर का निर्माण कर सकते हैं।