2013-03-08 11 views
7

मैं उदाहरण या एक अच्छी किताब के साथ इंटेल x64 विधानसभा ट्यूटोरियल के बारे में खोज करने के लिए कोशिश की, लेकिन मैं यह भी इंटेल साइट में भी नहीं मिला।इंटेल x86-64 विधानसभा ट्यूटोरियल या किताब

हां, तो आप मुझे सुझाव है कि सकता है कि के लिए एक अच्छा ट्यूटोरियल या किताब ?? मैं लिनक्स पर नस्ल का उपयोग कर रहा हूं।

धन्यवाद

+2

मुझे नासम ट्यूटोरियल के बारे में पता नहीं है, लेकिन आप [इंटेल सॉफ्टवेयर डेवलपर मैनुअल] प्राप्त कर सकते हैं (http://www.intel.com/content/www/us/en/processors/architectures-software-developer- manuals.html), जो आपको बहुत उपयोगी लगाना चाहिए। –

+0

intel.com पर एक ट्यूटोरियल? यह एक गरीब मजाक की तरह लगता है। [पॉल कार्टर के ट्यूटोरियल] से शुरू करें (http://www.drpaulcarter.com/pcasm/)। आश्चर्य की बात है, यह NASM पर आधारित है। जब आप 32-बिट असेंबली मास्टर करते हैं, तो 64 पर स्विच करें। –

+0

मैं रे Seyfarth द्वारा लिनक्स के लिए 64 बिट इंटेल असेंबली भाषा प्रोग्रामिंग के परिचय की सलाह देते हैं। पुस्तक NASM के बजाय YASM का उपयोग करती है, लेकिन YASM AFAIK को लगभग सभी NASM कोड स्वीकार करता है और डीडब्ल्यूएआरएफ 2 डीबगिंग डेटा प्रारूप इत्यादि का भी समर्थन करता है। पुस्तक में कुछ एसएसई और एवीएक्स कोड भी हैं, और यह केवल कुछ प्रोग्रामिंग पृष्ठभूमि मानता है और यहां तक ​​कि द्विआधारी और हेक्साडेसिमल संख्या आदि भी बताता है। मैंने डीओएस दिनों में x86 असेंबली को वापस सीखा है, लेकिन यह पुस्तक लिनक्स x86-64 असेंबली में चीजों को कैसे किया जाता है, इस पर एक उपयोगी संदर्भ के रूप में कार्य करता है। – nrz

उत्तर

15

वैसे यह व्यक्तिगत पूर्वाग्रह कैसे आप प्रोग्रामिंग के बारे में जानने के लिए पसंद करते हैंहै।

लेकिन विशेष रूप से संयोजन भाषाओँ के संबंध में, मैं एक दृष्टिकोण है जो मुझे करने के लिए विधानसभा भाषा पर अनुदेश सेट संदर्भ मैनुअल और/या किताबें पढ़ने (जहां वे मौजूद हैं) की तुलना में अधिक उपयोगी साबित हुआ है पाया।

क्या मैं सामान्य रूप से यह पता लगाने की कैसे विधानसभा एक नया सीपीयू के लिए काम करता हैं/एक OS मंच मैं के साथ अभी तक काम नहीं किया है पर मेरे लिए एक सीपीयू अज्ञात लाभ उठाने के लिए डेवलपर toolchain है। इस तरह:

  • लक्ष्य CPU के लिए स्वयं को (क्रॉस-) कंपाइलर और डिस्सेबलर इंस्टॉल करें। इन दिनों, जीएनयू जीसीसी के/binutils सर्वव्यापकता अक्सर मतलब है कि gcc और objdump -d है।

  • , छोटे कार्यक्रमों/sourcecode के छोटे टुकड़े का एक समूह बनाने की तरह:

extern int funcA(int arg); 
extern int funcB(int arg1, int arg2); 
extern int funcC(int arg1, int arg2, int arg3); 
extern int funcD(int arg1, int arg2, int arg3, int arg4); 
extern int funcE(int arg1, int arg2, int arg3, int arg4); 
extern int funcF(int arg1, int arg2, int arg3, int arg4, int arg5); 
extern int funcG(int arg1, int arg2, int arg3, int arg4, int arg5, int arg6); 
extern int funcH(int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, 
       int arg7); 

int main(int argc, char **argv) 
{ 
    printf("sum of all funcs: %d\n", 
     funcA(1) + funcB(2, 3) + funcC(4, 5, 6) + funcD(7, 8, 9, 10) + 
     funcE(11, 12, 13, 14, 15) + funcF(16, 17, 18, 19, 20, 21) + 
     funcG(22, 23, 24, 25, 26, 27, 28) + funcH(29, 30, 31, 32, 33, 34, 35)); 
    return 12345; 
}
  • संकलक अनुकूलन के साथ इन संकलन और उत्पन्न वस्तु कोड एकत्रित न।
    कोड की संरचना काफी सरल प्रदर्शित करने के लिए कैसे ABI wrt बर्ताव करता है। समारोह बुला लिए, गुजर तर्क और लौटने मूल्यों, प्रबंध रजिस्टर अंतरिक्ष wrt। फ़ंक्शन कॉल करते समय कौन से पंजीयक संरक्षित/अस्थिर होते हैं। यह आपको निरंतर डेटा प्रारंभ करने और स्टैक एक्सेस और प्रबंधन जैसे "गोंद" के लिए कुछ बुनियादी असेंबली कोड भी दिखाएगा।

  • सरल सी भाषा और if/else या switch बयान छोरों की तरह निर्माणों के लिए इस विस्तार। हमेशा बाहरी अपरिभाषित कार्यों में कुछ कॉल रखें क्योंकि ऐसा करने से कंपाइलर ऑप्टिमाइज़र आपके सभी "टेस्ट कोड" को फेंकने से रोक देगा, और जब आप if()switch() के परीक्षणों का उपयोग करते हैं, argc (या अन्य फ़ंक्शन तर्क) पर अनुमान लगाएं क्योंकि संकलक भविष्यवाणी नहीं कर सकता या तो (और इसलिए "अजीब तरह से" कोड के निर्माण खंड को अनुकूलित करें)।

  • struct {} और class {} विभिन्न आदिम डेटा प्रकार के दृश्यों से युक्त परिभाषाओं प्रयोग करने के लिए इस विस्तार के क्रम में पता लगाने के लिए संकलक स्मृति, जो विधानसभा निर्देश बाइट्स/शब्द/ints/देशांतर/तैरता तक पहुँचने के लिए उपयोग किया जाता है में इन की व्यवस्था इत्यादि
    टेस्ट कोड के इन सभी टुकड़े जानबूझकर भिन्न हो सकते हैं (जैसे, + से विभिन्न परिचालनों का उपयोग करें), और/या निर्देश सेट और एबीआई के विशिष्ट टुकड़ों के बारे में अधिक जानने के लिए और अधिक जटिल बनाते हैं।

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

इसके बाद ही मैं सुझाव दूंगा कि आप वास्तव में विशिष्ट प्लेटफ़ॉर्म के लिए निर्देश सेट संदर्भ को ट्रैक करें।

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

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

अर्थात, और यह सब योग करने के लिए, मेरे सुझाव से विधानसभा सीखना है शीर्ष नीचे बजाय नीचे से ऊपर से।

साइड नोट:

क्यों मैं जब इस तरह के सरल उदाहरण के लिए संकलक उत्पन्न विधानसभा कोड का विश्लेषण करने संकलक अनुकूलन उपयोग करने के लिए सुझाव दे रहा हूँ?
ठीक है, इसका उत्तर इसलिए है क्योंकि, कुछ के लिए counterintuitively, जनरेटेड असेंबली कोड बहुत आसान है यदि आप कंपाइलर चीजों से बाहर नरक अनुकूलित करने देते हैं। अनुकूलन के बिना, कंपाइलर अक्सर "बेवकूफ" कोड बनाते हैं उदा। सभी वैरिएबल को स्टैक में रखता है, वहां से किसी भी कारण से बचाता है और उन्हें पुनर्स्थापित करता है, रजिस्टर करता है, रजिस्टर करता है/पुनर्स्थापित करता है/प्रारंभिकता केवल उस ओवरराइट को ओवरराइट करने के लिए करता है जो कि अगले निर्देश और कई और चीजें हैं। इस वजह से उत्सर्जित कोड की मात्रा बहुत अधिक है। यह क्रूर के साथ peppered और समझने के लिए बहुत कठिन है। कंपाइलर ऑप्टिमाइज़ेशन बलों को इस क्रुफ्ट को आवश्यक रूप से कम करने के लिए मजबूर करता है, जो प्लेटफार्म एबीआई और आकस्मिक रूप से समझने के लिए आप देखना चाहते हैं। इसलिए, कंपाइलर अनुकूलन का उपयोग करें।

+0

यह एक बेहद अच्छा विचारधारा/उत्तर है। बहुत बहुत धन्यवाद। – gideon

+0

यह एसओ पर मैंने कभी देखा है सबसे अच्छा जवाब है। –

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