विधानसभा सीखना [बंद]


102

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

मैं विंडोज़ का उपयोग कर रहा हूँ (यदि इससे कोई फ़र्क पड़ता है)।

संपादित करें: तो, लगता है कि हर कोई MASM की ओर इशारा कर रहा है। यद्यपि मुझे यह बात मिलती है कि इसमें उच्च स्तरीय क्षमताएं हैं, असेंबली कोड प्रोग्रामर के लिए सभी अच्छे हैं, यही वह नहीं है जिसकी मुझे तलाश है। ऐसा लगता है कि, यदि लोकप्रिय इन्वेस्टर्स (जैसे आईडीए) में निर्देश, इनवोक, आदि नहीं दिखाए गए हैं। इसलिए यदि संभव हो तो मैं क्या सुनना चाहूंगा, किसी की भी राय है जो एएसएम का उपयोग उन उद्देश्यों के लिए कर रहा है जो मैं पूछ रहा हूं (आईडीए में डेज़स्मबल्ड एक्स के कोड को पढ़ना), न कि केवल "सामान्य" असेंबली प्रोग्रामर।

संपादित करें: ठीक है। मैं पहले से ही विधानसभा सीख रहा हूं। मैं MASM सीख रहा हूं, मेरे लिए उच्च स्तरीय सामान का उपयोग नहीं करना। मैं अभी जो कर रहा हूं वह __ सीस पर मेरे कोड को सी + + में आज़मा रहा है, इसलिए मैं चीजों को तेज़ी से आज़मा सकता हूं जैसे कि मुझे एमएएसएम के साथ स्क्रैच से सब कुछ करना था।


करने के लिए इसी तरह के सवाल stackoverflow.com/questions/1355524/...
TrueWill

हां, मैं वह भी पढ़ रहा था। लेकिन मेरा सवाल थोड़ा और "केंद्रित" है, मैं कहूंगा।
ईप्सियम

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

2
"ऐसा लगता है कि अगर, आह्वान, आदि निर्देश" - वे मैक्रोज़ ("MASM" में 'M') हैं और यदि कोडांतरक उनका समर्थन करता है, तो भी आपको उनका उपयोग करने की आवश्यकता नहीं है।
क्रिस डब्ल्यूडब्ल्यू

3
यह सवाल 65 वें उत्थान के लिए एक कठिन निर्णय था, 64 इतनी सुंदर संख्या है। । ।
735Tesla

जवाबों:


40

MASM32 से शुरू करें और वहां से FASM देखें । लेकिन आप MASM के साथ मज़े करेंगे।


मैंने MASM से सुना है। अगर मैं गलत नहीं हूं, तो इसमें "उच्च स्तर" की बहुत सारी विशेषताएं हैं, जो कि मैं तब नहीं देखता जब मैं असंतुष्ट कोड को देखता हूं। मैं कुछ ऐसा प्रोग्राम करना चाहता हूं जो बिलकुल डिस्सैम्बलर्स आउटपुट कोड की तरह हो, अगर यह समझ में आता है।
ईप्सियम

1
यह मूल रूप से ऑप कोड लिखने जैसा होगा, जिसका वास्तव में कोई मतलब नहीं है। MASM32 सीखना आपको यह समझने में मदद करेगा कि एक डिबगर में कोड कैसा दिखता है। आप OllyDbg: ollydbg.de
दोपहर रेशम

7
आपको विधानसभा समझ में नहीं आती। आपको इसे समझने की जरूरत है। एक opcode एक संख्या है। डिबगर अपने निर्देशों (कभी-कभी इसकी कड़ी मेहनत) को ऑपकोड हल करने का प्रयास करेंगे। आपको मूल निर्देशों को समझने की आवश्यकता है। MASM सीखने से आपको ऐसा करने में मदद मिलेगी। और कुछ कहने की जरूरत नहीं है।
दोपहर रेशम

5
आपको सभी MASM विशेषताओं का उपयोग केवल इसलिए नहीं करना है क्योंकि वे वहां हैं; आप अपनी इच्छानुसार चीजों को पढ़ना मुश्किल बना सकते हैं, अगर आपको लगता है कि आप इस तरह से अधिक सीखेंगे।
जेसनट्र्यू

3
MASM, अपने क्विरक्स, बग्स, और तथाकथित उच्च-स्तरीय विशेषताओं के साथ असेंबली प्रोग्रामर-बिगिनर्स और एक्सपर्ट्स को भ्रमित करने के लिए अधिक काम किया है - जितना मैं सोच सकता हूं, उससे अधिक।
IJ कैनेडी

44

मैंने कई बार ऐसा किया है और यह करना जारी रखता हूं। इस मामले में जहां आपका प्राथमिक लक्ष्य पढ़ रहा है और कोडांतरक नहीं लिख रहा है, मुझे लगता है कि यह लागू होता है।

अपने खुद के 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 के साथ) की सलाह देता हूं, न ही उत्पादनमहान कोड, लेकिन वे बहु मंच और बहु ​​लक्ष्य हैं और दोनों में ऑप्टिमाइज़र हैं। और दोनों स्वतंत्र हैं और आप विभिन्न लक्ष्य प्रोसेसर के लिए स्रोतों से आसानी से क्रॉस कंपाइलर का निर्माण कर सकते हैं।


उत्तर के लिए धन्यवाद। लेकिन मुझे यह भी पता नहीं है कि एक डिस्सेम्बलर कैसे लिखा जाता है।
निगल Elysium

8
"अपने खुद के डिस्सेम्बलर लिखें" - मैं सहमत हूं, यह है कि मैंने इसे सबसे अच्छा कैसे सीखा। (क्या हो रहा है "लेकिन मैं यह भी नहीं जानता कि कैसे एक disassembler लिखने के लिए"?) योग्य।
स्लैशमाईस

मैं आपके साथ जा रहा हूँ! बस एक MSP430 और उस पर एक किताब खरीदी ... :)
पेपे

1
मेरे पास कुछ msp430 उदाहरण हैं github.com/dwelch67 प्लस कुछ निर्देश सेट सिमुलेटर के साथ सीखने के लिए प्रयोग करने के लिए asm, आदि
Old_timer

मैं वास्तव में, इस विचार को वास्तव में पसंद करता हूं।
मिलि स्मिथ

33

विधानसभा आप हाथ से लिखेंगे और एक संकलक द्वारा उत्पन्न विधानसभा अक्सर उच्च स्तर से देखे जाने पर बहुत भिन्न होती है। बेशक, कार्यक्रम की सराय बहुत समान होगी ( a = b + cसभी के बाद सांकेतिक शब्दों में बदलना करने के लिए बहुत सारे अलग-अलग तरीके हैं ), लेकिन जब आप कुछ इंजीनियर को उलटने की कोशिश कर रहे हैं तो वे परेशानी नहीं हैं। कंपाइलर एक टन बॉयलरप्लेट कोड को सरल निष्पादन योग्य में भी जोड़ देगा : पिछली बार जब मैंने GCC द्वारा संकलित "हैलो वर्ल्ड" की गणना लगभग 4kB की थी, जबकि अगर विधानसभा में हाथ से लिखा जाता है तो यह लगभग 100 बाइट्स होता है। यह विंडोज पर बदतर है: पिछली बार जब मैंने तुलना की थी (बेशक, यह पिछली शताब्दी थी) सबसे छोटी "हैलो वर्ल्ड" मैं अपने विंडोज कंपाइलर को 52kB जेनरेट करने के लिए चुन सकता था! आमतौर पर इस बॉयलरप्लेट को केवल एक बार निष्पादित किया जाता है, यदि बिल्कुल भी, तो यह प्रोग्राम की गति को बहुत अधिक प्रभावित नहीं करता है - जैसे मैंने ऊपर कहा, कार्यक्रम का मूल हिस्सा, जहां सबसे अधिक निष्पादन समय खर्च होता है, आमतौर पर बहुत समान होता है चाहे संकलित किया गया हो या हाथ से लिखा हुआ।

दिन के अंत में, इसका मतलब है कि एक विशेषज्ञ असेंबली प्रोग्रामर और एक विशेषज्ञ डिस्सेम्बलर दो अलग-अलग विशेषताएं हैं। आमतौर पर वे एक ही व्यक्ति में पाए जाते हैं, लेकिन वे वास्तव में अलग हैं, और एक उत्कृष्ट असेंबली कोडर बनना सीखना आपको उल्टा इंजीनियरिंग सीखने में मदद नहीं करेगा।

आप क्या करना चाहते हैं IA-32 और AMD64 (दोनों को एक साथ कवर किया गया है) Intel और AMD से आर्किटेक्चर मैनुअल , और निर्देश और opcodes पर शुरुआती खंडों को देखें। हो सकता है कि विधानसभा भाषा पर एक ट्यूटोरियल या दो पढ़ें, बस विधानसभा भाषा की मूल बातें नीचे लाने के लिए। फिर एक छोटा पकड़ोनमूना कार्यक्रम जिसे आप रुचि रखते हैं और इसे अलग करना चाहते हैं: अपने नियंत्रण प्रवाह के माध्यम से कदम उठाएं और समझने की कोशिश करें कि यह क्या कर रहा है। देखें कि क्या आप इसे कुछ और करने के लिए पैच कर सकते हैं। फिर एक और कार्यक्रम के साथ फिर से प्रयास करें, और तब तक दोहराएं जब तक आप एक अधिक उपयोगी लक्ष्य प्राप्त करने के लिए पर्याप्त आराम न करें। आप रिवर्स इंजीनियरिंग समुदाय द्वारा निर्मित "क्रेम्स" जैसी चीजों में दिलचस्पी ले सकते हैं, जो रिवर्स इंजीनियरिंग में रुचि रखने वाले लोगों के लिए अपने हाथ आजमाने के लिए चुनौतियां हैं, और उम्मीद है कि रास्ते में कुछ सीखें। वे बुनियादी से मुश्किल में शुरू होते हैं (यहाँ शुरू!) असंभव।

इन सबसे ऊपर, आपको बस अभ्यास करने की आवश्यकता है । कई अन्य विषयों की तरह, रिवर्स इंजीनियरिंग के साथ, अभ्यास परिपूर्ण बनाता है ... या कम से कम बेहतर


मुझे पता है कि जब आप उच्च स्तरीय भाषा के साथ कुछ भी संकलित करते हैं, तो आपको बहुत सारे "कचरा" कोड मिलेंगे जिनकी आवश्यकता नहीं होगी, इसे सीधे विधानसभा में कोडित किया गया था। मैं यह भी समझता हूं कि विशेषज्ञ असेंबली प्रोग्रामर और विशेषज्ञ डिस्सेम्बलर के बीच अंतर है। लेकिन लगभग सभी चीजों के बारे में यही कहा जा सकता है।
१३:०१ पर ईलियम

3
मेरी चिंता यह है कि थ्योरी में रहते हुए मैं पेपर पढ़ सकता था और उन्हें इससे मतलब हो सकता है कि जब तक मैं खुद चीजों को लिखना शुरू नहीं कर देता, मुझे विश्वास नहीं होता कि मैं वास्तव में इसे समझूंगा। आप कहते हैं कि मैं कोड के छोटे भागों को बदलकर शुरू कर सकता हूं, लेकिन ऐसा करने के लिए मुझे पहले यह जानना होगा कि किस प्रकार की विधानसभा "स्वाद" आईडीए समर्थक, उदाहरण के लिए, उपयोग करता है।
१३:०१ पर ईलियम

इसके अलावा, इनलाइन असेंबली कोड के लिए MSVC ++ क्या उपयोग करता है? MASM?
१४:०० बजे

15

मैं सबसे जवाब के अनाज के खिलाफ जाऊंगा और MIPS RISC वास्तुकला के नथ के MMIX संस्करण की सिफारिश करूंगा । यह x86 या ARM असेंबली भाषाओं की तरह व्यावहारिक रूप से उपयोगी नहीं होगा (ऐसा नहीं है कि इन दिनों वे वास्तविक जीवन में सबसे महत्वपूर्ण हैं ... ;-), लेकिन यह आपके लिए नथ के नवीनतम के जादू को खोल देगा। एल्गोरिदम और डेटा संरचनाओं की गहरी निम्न-स्तरीय समझ पर सबसे बड़ी कृति का संस्करण - TAOCP , "द आर्ट ऑफ़ कंप्यूटर प्रोग्राम"। मेरे द्वारा उद्धृत दो URL के लिंक इस संभावना की खोज शुरू करने का एक शानदार तरीका है!


12

(मैं आपके बारे में नहीं जानता लेकिन मैं विधानसभा से उत्साहित था)

असेंबली के साथ प्रयोग करने का एक सरल उपकरण पहले से ही आपके पीसी में स्थापित है।

स्टार्ट मेनू पर जाएं-> रन करें, और टाइप करेंdebug

डीबग (कमांड)

डीबग DOS, MS-DOS, OS / 2 और Microsoft Windows (केवल x86 संस्करण, x 64 नहीं) में एक कमांड है जो प्रोग्राम debug.exe (या DOS के पुराने संस्करणों में DEBUG.COM) चलाता है। डीबग एक असेंबलर, डिस्सैम्बलर, या हेक्स डंप प्रोग्राम के रूप में कार्य कर सकता है जो उपयोगकर्ताओं को स्मृति सामग्री (असेंबली भाषा, हेक्साडेसिमल या एएससीआईआई) में अंतःक्रियात्मक रूप से जांच करने की अनुमति देता है, परिवर्तन करता है और COM, EXE और अन्य फ़ाइल प्रकारों का चयन करता है। इसमें कई उप-क्षेत्र भी हैं जिनका उपयोग विशिष्ट डिस्क क्षेत्रों, I / O पोर्ट और मेमोरी एड्रेस को एक्सेस करने के लिए किया जाता है। MS-DOS डीबग 16-बिट प्रक्रिया स्तर पर चलता है और इसलिए यह 16-बिट कंप्यूटर प्रोग्राम तक सीमित है । FreeDOS डीबग में "DEBUGX" संस्करण है जो 32-बिट DPMI कार्यक्रमों का भी समर्थन करता है।

ट्यूटोरियल:


यदि आप आईडीए प्रो (या ओलीडबग ) में देखे गए कोड को समझना चाहते हैं , तो आपको यह सीखना होगा कि संकलित कोड कैसे संरचित है। मैं किताब को उलटने की सलाह देता हूं : रिवर्स इंजीनियरिंग का रहस्य

मैंने कुछ हफ़्ते पहले प्रयोग किया debugजब मैंने विधानसभा (15 साल पहले) सीखना शुरू किया।
ध्यान दें कि debugबेस मशीन स्तर पर काम करता है, कोई उच्च स्तरीय असेंबली कमांड नहीं हैं।

और अब एक सरल उदाहरण:

दो aविधानसभा कोड लिखने शुरू करने के लिए - कार्यक्रम नीचे टाइप करें - और अंत में दे gइसे चलाने के लिए।

वैकल्पिक शब्द


( INT 21स्क्रीन पर प्रदर्शित ASCII चार DLरजिस्टर में संग्रहीत किया जाता है, अगर AHरजिस्टर 2- INT 20कार्यक्रम समाप्त हो जाता है)


मुझे "G" दर्ज करने से पहले ctrl-c को हिट करना था।
20

2
@ericp, आपको ctrl-c नहीं मारना है। उदाहरण के लिए, आप aअसेंबली कोड लिखना शुरू करने के लिए टाइप करें [दर्ज करें]। यदि आप हिट करते हैं [दो बार] आप असेंबली मोड से बाहर निकलें। g& [दर्ज करें] इसे चलाने के लिए (डिफ़ॉल्ट रूप से 100 ऑफसेट)।
निक डंडौलकिस

क्या यह वास्तव में स्टैक ओवरफ्लो का कारण बनता है या क्या यह सिर्फ स्क्रीन पर लिखता है?
Janus Troelsen

1
@user, यह सिर्फ इस साइट का नाम लिखता है :-)
Nick Dandoulakis

@JanusTroelsen उन संख्याओं (53, 74, 61, आदि) 'S' 't' 'a' के लिए ASCII कोड हैं ... प्रत्येक Int21 कॉल एक समय में एक वर्ण को मुद्रित कर रहा है! यही कारण है कि असेंबली तेज़ नहीं है :)
doug65536

8

मैंने हैकिंग पाया : शोषण की कला इस विषय में एक दिलचस्प और उपयोगी तरीका है ... यह नहीं कह सकता कि मैंने कभी भी सीधे ज्ञान का उपयोग किया है, लेकिन यह वास्तव में नहीं है कि मैंने इसे क्यों पढ़ा। यह आपको उन निर्देशों की अधिक समृद्ध सराहना करता है जो आपके कोड को संकलित करता है, जो कभी-कभी उप-प्रकार के कीड़ों को समझने में उपयोगी होता है।

शीर्षक से मत हटाओ। पुस्तक के पहले भाग का अधिकांश शब्द "हैकिंग" है एरिक रेमंड शब्द में: कठिन समस्याओं को हल करने के लिए रचनात्मक, आश्चर्यजनक, लगभग डरपोक तरीके। मैं (और शायद आप) सुरक्षा पहलुओं में बहुत कम रुचि रखते थे।


7

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

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

मैं मूल बातों पर विचार करूंगा:

  • रजिस्टर: कितने हैं, उनके नाम क्या हैं, और उनके आकार क्या हैं?
  • ऑपरेंड ऑर्डर: का add eax, ebxअर्थ है "ईएक्स को ईएक्सएक्स में जोड़ें और ईएक्सएक्स में परिणाम को स्टोर करें"।
  • FPU: फ़्लोटिंग-पॉइंट स्टैक की मूल बातें जानें और आप कैसे / से fp में परिवर्तित होते हैं।
  • संबोधित करने के तरीके: [आधार + ऑफसेट * गुणक], लेकिन गुणक केवल 1, 2 या 4 या (या 8) हो सकता है?
  • कॉलिंग कन्वेंशन: एक फ़ंक्शन को पैरामीटर कैसे पारित किया जाता है?

बहुत बार यह आश्चर्यचकित हो जाएगा कि संकलक क्या उत्सर्जन करता है। यह समझ में आने की एक पहेली बनाएं कि क्यों संकलक ने सोचा कि यह एक अच्छा विचार होगा। यह आपको बहुत कुछ सिखाएगा।

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

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

सौभाग्य!


3

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


3

डिबग का उपयोग करने का सुझाव एक मजेदार है, इसके साथ कई स्वच्छ चालें की जा सकती हैं। हालांकि, एक आधुनिक ऑपरेटिंग सिस्टम के लिए, 16bit विधानसभा सीखना थोड़ा कम उपयोगी हो सकता है। इसके बजाय, ntsd.exe का उपयोग करके विचार करें। यह विंडोज एक्सपी में बनाया गया है (यह सर्वर 2003 और इसके बाद के संस्करण में, दुर्भाग्य से), जो इसे व्यापक रूप से उपलब्ध होने के बाद से सीखने के लिए एक सुविधाजनक उपकरण बनाता है।

उस ने कहा, XP में मूल संस्करण कई बग से ग्रस्त है। यदि आप वास्तव में इसका उपयोग करना चाहते हैं (या सीडीबी, या विंडबग, जो अनिवार्य रूप से एक ही कमांड सिंटैक्स और डिबगिंग बैक-एंड के साथ अलग-अलग इंटरफेस हैं), तो आपको मुफ्त विंडोज़ डिबगिंग टूल पैकेज स्थापित करना चाहिए ।

असामान्य सिंटैक्स का पता लगाने का प्रयास करते समय उस पैकेज में शामिल डिबगर.चम फ़ाइल विशेष रूप से उपयोगी होती है।

Ntsd के बारे में बड़ी बात यह है कि आप इसे अपने पास मौजूद किसी भी XP मशीन पर पॉप अप कर सकते हैं और इसका उपयोग असेंबली या असेंबल करने के लिए कर सकते हैं। यह / महान / X86 असेंबली लर्निंग टूल बनाता है। उदाहरण के लिए (dd प्रॉम्प्ट में इनलाइन होने के बाद से cdb का उपयोग करना, यह अन्यथा समान है):

(प्रतीक त्रुटियां समाप्त हो गई हैं क्योंकि वे अप्रासंगिक हैं - साथ ही, मुझे उम्मीद है कि यह प्रारूपण काम करता है, यह मेरी पहली पोस्ट है)

C:\Documents and Settings\User>cdb calc

Microsoft (R) Windows Debugger Version 6.10.0003.233 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: calc
Symbol search path is: *** Invalid ***
Executable search path is:
ModLoad: 01000000 0101f000   calc.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
ModLoad: 7c9c0000 7d1d7000   C:\WINDOWS\system32\SHELL32.dll
ModLoad: 77dd0000 77e6b000   C:\WINDOWS\system32\ADVAPI32.dll
ModLoad: 77e70000 77f02000   C:\WINDOWS\system32\RPCRT4.dll
ModLoad: 77fe0000 77ff1000   C:\WINDOWS\system32\Secur32.dll
ModLoad: 77f10000 77f59000   C:\WINDOWS\system32\GDI32.dll
ModLoad: 7e410000 7e4a1000   C:\WINDOWS\system32\USER32.dll
ModLoad: 77c10000 77c68000   C:\WINDOWS\system32\msvcrt.dll
ModLoad: 77f60000 77fd6000   C:\WINDOWS\system32\SHLWAPI.dll
(f2c.208): Break instruction exception - code 80000003 (first chance)
eax=001a1eb4 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c90120e esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000> r eax
eax=001a1eb4
0:000> r eax=0
0:000> a eip
7c90120e add eax,0x100
7c901213
0:000> u eip
ntdll!DbgBreakPoint:
7c90120e 0500010000      add     eax,100h
7c901213 c3              ret
7c901214 8bff            mov     edi,edi
7c901216 8b442404        mov     eax,dword ptr [esp+4]
7c90121a cc              int     3
7c90121b c20400          ret     4
ntdll!NtCurrentTeb:
7c90121e 64a118000000    mov     eax,dword ptr fs:[00000018h]
7c901224 c3              ret
0:000> t
eax=00000100 ebx=7ffd6000 ecx=00000007 edx=00000080 esi=001a1f48 edi=001a1eb4
eip=7c901213 esp=0007fb20 ebp=0007fc94 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!DbgUserBreakPoint+0x1:
7c901213 c3              ret
0:000>`

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


1
क्रिस ईगल की किताब के लिए +1। होगा r00t की Sk3wl के लिए वहाँ में कुछ प्यार डाल;)
mrduclaw

3

मैंने हाल ही में एक कंप्यूटर सिस्टम क्लास ली। हार्डवेयर के साथ संवाद करने के लिए एक विषय के रूप में विधानसभा था।

मेरे लिए, कंप्यूटर सिस्टम कैसे काम करता है, इसका विवरण समझे बिना विधानसभा का ज्ञान पूर्ण नहीं होता। यह समझना कि, एक प्रोसेसर आर्किटेक्चर पर असेंबली निर्देश महान क्यों है, लेकिन एक और वास्तुकला पर भयानक है की एक नई समझ में लाता है।

इसे देखते हुए, मैं अपनी कक्षा की पाठ्य पुस्तक की सिफारिश करने के लिए इच्छुक हूं:

कंप्यूटर सिस्टम: एक प्रोग्रामर का दृष्टिकोण

कंप्यूटर सिस्टम: एक प्रोग्रामर का दृष्टिकोण
(स्रोत: cmu.edu )

यह x86 असेंबली को कवर करता है लेकिन पुस्तक इससे कहीं अधिक व्यापक है। यह प्रोसेसर पाइप-लाइनिंग और मेमोरी को कैश, वर्चुअल मेमोरी सिस्टम और बहुत कुछ के रूप में कवर करता है। यह सब प्रभावित कर सकता है कि दी गई सुविधाओं के लिए विधानसभा को कैसे अनुकूलित किया जा सकता है।


2

मुझे लगता है कि आप ASCII-ized-opcode mnemonics (और उनके मापदंडों) को सीखना चाहते हैं, जो एक डिस्सैम्बलर द्वारा आउटपुट होते हैं और जिन्हें एक असेंबलर द्वारा इनपुट के रूप में इस्तेमाल किया जा सकता है।

कोई भी असेंबलर (जैसे MASM) करेगा।

और / या आपके लिए इसके बारे में एक किताब पढ़ना बेहतर हो सकता है (एसओ पर सिफारिश की गई किताबें हैं, मुझे याद नहीं है जो)।


2

क्या आप खिड़कियों पर अन्य देव कार्य कर रहे हैं? किस आईडीई पर? यदि यह वीएस है, तो असंतुष्ट कोड को पढ़ने के लिए अतिरिक्त आईडीई की कोई आवश्यकता नहीं है: अपने ऐप को डिबग करें (या किसी बाहरी ऐप को संलग्न करें), फिर डिसएफ़ीड विंडो खोलें (डिफ़ॉल्ट सेटिंग्स में, जो कि Alt + 8 है)। सामान्य कोड के माध्यम से स्टेप और वॉच मेमोरी / रजिस्टर देखें। तुम भी एक रजिस्टर खिड़की खुला रखना चाहते हो सकता है (डिफ़ॉल्ट रूप से Alt + 5)।

इंटेल नि: शुल्क मैनुअल देता है , जो बुनियादी वास्तुकला (रजिस्टरों, प्रोसेसर इकाइयों आदि) का एक सर्वेक्षण और एक पूर्ण अनुदेश संदर्भ देता है। जैसा कि आर्किटेक्चर परिपक्व होता है और अधिक जटिल हो रहा है, 'बुनियादी वास्तुकला' मैनुअल कम और कम पठनीय होते हैं। यदि आप एक पुराने संस्करण पर अपना हाथ प्राप्त कर सकते हैं, तो आपके पास शुरू करने के लिए एक बेहतर स्थान होगा (यहां तक ​​कि पी 3 मैनुअल भी - वे एक ही मूल निष्पादन वातावरण को बेहतर बताते हैं)।

यदि आप किसी पुस्तक में निवेश करना चाहते हैं, तो यहाँ एक अच्छा परिचयात्मक पाठ है। 'X86' के लिए अमेज़ॅन खोजें और आपको कई अन्य मिलेंगे। आप यहां एक और प्रश्न से कई अन्य दिशा-निर्देश प्राप्त कर सकते हैं

अंत में, आप से काफ़ी फायदा हो सकता है पढ़ने कुछ कम - स्तर ब्लॉग। ये बाइट आकार की जानकारी बिट्स व्यक्तिगत रूप से मेरे लिए सबसे अच्छा काम करती हैं।


2

यह जरूरी नहीं कि आप कुशल कोड लिखने में मदद करेंगे!

i86 सेशन कोड कमोबेश एक "विरासत" प्रारूप है, जो विंडोज और लिनक्स के लिए कोड और निष्पादन योग्य बायनेरी मात्रा के कारण बनी रहती है।

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

इसलिए कंपाइलर डिफ़ॉल्ट रूप से x86 कोड उत्पन्न करते हैं, और, आधुनिक चिप्स aceint ओप कोड पढ़ते हैं और जो वे समानांतर risc निर्देश में देखते हैं, उन्हें पुन: व्यवस्थित निष्पादन, सट्टा निष्पादन, पाइपलाइनिंग आदि के साथ जोड़ते हैं और साथ ही वे 32 या 64 प्रोसेसर का पूर्ण उपयोग करते हैं। वास्तव में (जैसा कि दयनीय 8 के विपरीत आप x86 निर्देशों में देखते हैं।)

अब सभी ऑप्टिमाइज़िंग कंपाइलर जानते हैं कि यह वास्तव में क्या होता है, इसलिए वे ओपी कोड्स के अनुक्रमों को कोड करते हैं, जिन्हें वे जानते हैं कि चिप कुशलता से अनुकूलन कर सकता है - भले ही इनमें से कुछ अनुक्रम 1990 के आस-पास के प्रोग्रामर के लिए अपर्याप्त दिखेंगे।

कुछ बिंदु पर आपको यह स्वीकार करने की आवश्यकता है कि 10 से हजारों आदमी वर्षों के प्रयास संकलक लेखकों ने भुगतान किया है, और, उन पर भरोसा करें।

एक और अधिक सामान्य रनटाइम प्राप्त करने का सबसे सरल और आसान तरीका इंटेल C / C ++ कंपाइलर खरीदना है। उनके पास पुतला संकलक के लिए एक आला बाजार है, और, उनके पास चिप डिजाइनरों से पूछने में सक्षम है कि अंदर क्या हो रहा है।


आपकी कहानी कुछ हद तक बताती है कि CISC प्रोसेसर आंतरिक रूप से RISC प्रोसेसर बन गए हैं। मुझे गलतफहमी हो सकती है, लेकिन यह केवल सच नहीं है। और दयनीय 8? आधुनिक प्रोसेसर (कहते हैं, 1999 के बाद से) में कई और शामिल हैं: 10 gpr: EAX-EFLAGS, 80 बिट FP0-FP7, 64-बिट MMX0-MMX7, 128-बिट XMM0-XMM7, खंड: CS-GS, विशेष: CR0-CR4 , DR0-DR7, TR3-TR7, GDTR, IDTR, LDTR, MSRs और x86-64 पर भी R8-R15। ये सभी रिंग -3 से सुलभ नहीं हैं, लेकिन अधिकांश हालिया (2006 के बाद) जीसीसी / वीसी ++ कंपाइलर द्वारा उपयोग किए जाते हैं। कुल मिलाकर "दयनीय 8" से थोड़ा अधिक;)।
हाबिल

2

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

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

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

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


1

वहाँ मानक शैक्षणिक भाषाओं में से एक MIPS है। आप इसके लिए MIPS सिमुलेटर (स्पिम) और विभिन्न शिक्षण सामग्री प्राप्त कर सकते हैं।

निजी तौर पर, मैं प्रशंसक नहीं हूं। मुझे IA32 पसंद है।


MIPS अच्छा है। 68000 है, और यदि आप 68000 सीखते हैं, तो आप MAME में चलने वाले बायनेरी लिख सकते हैं। :-)
नोसरेडना

1

मेरा व्यक्तिगत पसंदीदा NASM है, ज्यादातर क्योंकि यह बहु-मंच है, और यह MMX, SSE, 64-बिट को संकलित करता है ...

मैंने कुछ सरल सी स्रोत फ़ाइल को gcc के साथ संकलित करना शुरू कर दिया, और असेंबलर निर्देश को gcc-format से NASM-format में "ट्रांस-कोडिंग" किया। फिर आप कोड के छोटे हिस्से को बदल सकते हैं, और प्रदर्शन में सुधार ला सकते हैं।

एनएएसएम प्रलेखन वास्तव में पूरा हो गया है, मुझे कभी भी पुस्तकों, या अन्य स्रोतों से जानकारी की तलाश करने की आवश्यकता नहीं थी।



0

यहाँ बहुत अच्छे जवाब। निम्न-स्तरीय प्रोग्रामिंग, असेंबली आदि सुरक्षा समुदाय में लोकप्रिय हैं, इसलिए जब आप जा रहे हों तो यह संकेत और युक्तियों की तलाश में है। उनके पास कुछ अच्छे ट्यूटोरियल भी हैं जैसे कि x86 असेंबली में यह एक है


0

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

अनप्टीमाइज्ड c / c ++ कोड की जांच से उस तरह के कोड में लिंक बनाने में मदद मिलेगी जो कंपाइलर आपके स्रोतों के लिए बनाता है। कुछ कंपाइलरों में कुछ प्रकार के एएसएम आरक्षित शब्द होते हैं जो आपको अपने कोड में मशीन निर्देश सम्मिलित करते हैं।

मेरी सलाह होगी कि उन उपकरणों के साथ थोड़ी देर के लिए खेलें और अपने पैरों को गीला कर लें, फिर कदम बढ़ाएं? नीचे? क्या आप कभी भी मंच पर चल रहे हैं पर कोड कोड को सीधे करने के लिए।

वहाँ बहुत सारे महान उपकरण हैं, लेकिन आपको यह अधिक मजेदार लग सकता है, पहली बार में सीखने की अवस्था से बचने के लिए।


0

हमने एक माइक्रोकंट्रोलर डेवलपमेंट किट (Motorola HC12) और एक मोटी डेटशीट के साथ असेंबली सीखी।


0

विषय के बारे में मुझे पता है, लेकिन चूंकि आप एक विंडोज प्रोग्रामर हैं, इसलिए मैं मदद नहीं कर सकता, लेकिन यह सोचें कि एमएसआईएल सीखने के लिए यह आपके समय का अधिक उपयुक्त और / या बेहतर उपयोग हो सकता है। नहीं, यह असेंबली नहीं है, लेकिन यह शायद इस .NET युग में अधिक प्रासंगिक है।


0

असेंबली जानना डिबगिंग के लिए उपयोगी हो सकता है, लेकिन मैं आपके कोड को अनुकूलित करने के लिए इसका उपयोग करने के बारे में बहुत उत्साहित नहीं हूं। आधुनिक संकलक आमतौर पर यह आशा करते हुए बेहतर होते हैं कि इन दिनों एक मानव।


हम्म। आप अभी भी अपने आप को थोड़ा अतिरिक्त कोडिंग असेंबली लिख सकते हैं, लेकिन यह संकलक को हरा करने के लिए अधिक काम लेता है, जितना कि यह करता था।
नोसरेडना

0

आप xorpd x86 असेंबली वीडियो कोर्स देख सकते हैं । (मैने यह लिखा)। पाठ्यक्रम में ही भुगतान किया जाता है, लेकिन अभ्यास खुले हैं, जीथूब पर। यदि आपके पास कुछ प्रोग्रामिंग अनुभव है, तो मुझे लगता है कि आपको केवल अभ्यास के साथ काम करने और सब कुछ समझने में सक्षम होना चाहिए।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.