2010-04-09 11 views
32

पढ़ने के लिए सीखना मैं असेंबली की कुछ बहुत ही प्राथमिक समझ लेने पर विचार कर रहा हूं। मेरा वर्तमान लक्ष्य सरल है: बहुत मूल जीसीसी असेंबलर आउटपुट की समझ जब सी/सी ++ को संकलित करते समय x86/x86-64 के लिए स्विच करें।जीसीसी असेंबलर आउटपुट

साधारण कार्यों को करने के लिए पर्याप्त है जैसे कि एक समारोह को देखना और यह सत्यापित करना कि जीसीसी उन चीज़ों को अनुकूलित करता है जिन्हें मैं गायब होने की उम्मीद करता हूं।

क्या किसी को भी जीसीसी के लिए प्रासंगिक असेंबली के लिए वास्तव में संक्षेप में परिचय/पता है और विशेष रूप से पढ़ने के उद्देश्य के लिए, और असल में पढ़ने वाले किसी भी महत्वपूर्ण निर्देशों की सूची जानना चाहिए?

+0

आपने निर्दिष्ट नहीं किया है कि आप किस लक्षित असेंबली भाषा में रूचि रखते हैं। इंटेल x86? PowerPC? –

+0

धन्यवाद, इसे जोड़ा गया। – porgarmingduod

उत्तर

19

यदि आप जीसीसी या क्लैंग का उपयोग कर रहे हैं, तो -masm = intel तर्क कंपाइलर को एटी & टी सिंटैक्स के बजाय इंटेल सिंटैक्स के साथ असेंबली उत्पन्न करने के लिए कहता है, और - सेव-टेम्पस तर्क अस्थायी फ़ाइलों को सहेजने के लिए कंपाइलर को बताता है (preprocessed स्रोत, असेंबली आउटपुट, अनलिंक ऑब्जेक्ट फ़ाइल) निर्देशिका में जीसीसी कहा जाता है।

x86 असेंबली की सतही समझ प्राप्त करना सभी संसाधनों के साथ आसान होना चाहिए। यहां एक ऐसा संसाधन है: http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

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

+1

है कि यह लेख एक छोटा और अच्छा पढ़ा गया है, धन्यवाद। – porgarmingduod

+3

यदि आप जीडीबी डिस्सेप्लर करते हैं, तो आप इंटेल सिंटैक्स के लिए 'सेट डिस्सेप्लिब्स-स्वाद इंटेल' का भी उपयोग कर सकते हैं। –

0

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

+0

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

+2

यदि आप x86 के लिए संकलित कर रहे हैं तो आप इंटेल असेंबली की तरह दिखने वाले आउटपुट असेंबली में जीसीसी प्राप्त करने के लिए कंपाइलर फ्लैग -masm = intel का उपयोग कर सकते हैं। – nategoose

2

"लापरवाही से पढ़ने विधानसभा" lol (अच्छी तरह से)

मैं रन टाइम पर gdb में पालन करके शुरू होगा; आप क्या हो रहा है के लिए एक बेहतर महसूस मिलता है। लेकिन फिर शायद यह सिर्फ मुझे। यह आपके लिए एक फ़ंक्शन डिस्सेबल करेगा (func discem) तो आप इसे

पर सेट कर सकते हैं यदि आप ऑप्टिमाइज़ेशन की जांच करने के लिए पूरी तरह से ऐसा कर रहे हैं - चिंता न करें।

क) संकलक एक अच्छा काम

ख) आप अभ्यस्त को समझने के लिए क्या यह वैसे भी कर रही है में सक्षम हो करता है (कोई भी)

+5

कभी-कभी मुझे अनुकूलित कोड को पढ़ने में आसान लगता है क्योंकि यह नोटिस करता है कि यह अनावश्यक है और इसे लिखने जैसा कुछ बदलता है। – avpx

+4

मेरे लिए, मुझे पता है कि ऑप्टिमाइज़ेशन की जांच के लिए इसे पूरी तरह से करना एक अच्छा विचार है। इसका कारण यह है कि हर बार जब मैं कंपाइलर को वास्तव में * स्थिति एक्स * के बारे में कुछ स्मार्ट कर रहा हूं, तो मैं भविष्य में किसी भी समय * सोच * नहीं व्यतीत करूंगा। avpx भी एक बहुत अच्छा मुद्दा है। – porgarmingduod

+1

+1, यह एक अच्छा विचार है, मैंने gdb पर एक सीडब्ल्यू में 'डिसस func' जोड़ा है: http://stackoverflow.com/questions/2588853/the-community-driven-gdb-primer/2611474#2611474। हर तरह से मैंने जो कुछ भी रखा है उसे संपादित करने के लिए स्वतंत्र महसूस करें। –

1

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

यदि आप अभी भी सीखना चाहते हैं असेंबली, जेफ डंटमैन द्वारा Assembly Language Step-by-Step: Programming with Linux पुस्तक को आजमाएं।

+0

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

3

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

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

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

+0

x86 ... समझदार? यह एक नया – jalf

21

आपको जीसीसी के -fverbose-asm विकल्प का उपयोग करना चाहिए। यह कंपाइलर आउटपुट अतिरिक्त जानकारी (टिप्पणियों के रूप में) बनाता है जो मूल सी/सी ++ कोड के असेंबली कोड के रिश्ते को समझना आसान बनाता है।

+0

जानना अच्छा है, धन्यवाद। – porgarmingduod

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