ऐतिहासिक रूप से, सी कंपाइलर्स असेंबली कोड उत्पन्न करते हैं, जिसे बाद में एक असेंबलर द्वारा मशीन कोड में अनुवादित किया जाएगा। इनलाइन असेंबली एक साधारण सुविधा के रूप में उभरती है - मध्यवर्ती असेंबली कोड में, उस बिंदु पर, कुछ उपयोगकर्ता द्वारा उठाए गए कोड को इंजेक्ट करें। कुछ कंपाइलर सीधे मशीन कोड उत्पन्न करते हैं, इस मामले में इनलाइन असेंबली स्निपेट के लिए मशीन कोड उत्पन्न करने के लिए वे एक असेंबलर होते हैं या बाहरी असेंबलर को कॉल करते हैं।
असेंबली कोड के लिए सबसे आम उपयोग विशेष प्रोसेसर निर्देशों का उपयोग करना है जो संकलक उत्पन्न करने में सक्षम नहीं है। उदाहरण के लिए, एक महत्वपूर्ण खंड के लिए इंटरप्ट को अक्षम करना, प्रोसेसर सुविधाओं को नियंत्रित करना (कैश, एमएमयू, एमपीयू, पावर मैनेजमेंट, सीपीयू क्षमताओं की पूछताछ, ...), कॉप्रोसेसरों और हार्डवेयर परिधीय (जैसे inb
/outb
x86 पर निर्देश) आदि का उपयोग करना, आप शायद ही कभी asm("movl %ecx %eax")
खोजें, क्योंकि यह सामान्य प्रयोजन रजिस्टरों को प्रभावित करता है कि इसके आसपास सी कोड भी उपयोग कर रहा है, लेकिन asm("mcr p15, 0, 0, c7, c10, 5")
जैसे कुछ का उपयोग (एआरएम पर डेटा मेमोरी बाधा) है। OSDev wiki में कोड स्निपेट के साथ कई उदाहरण हैं।
विधानसभा कोड सी के प्रवाह नियंत्रण मॉडल को तोड़ने वाली सुविधाओं को लागू करने के लिए भी उपयोगी है। एक आम उदाहरण धागे के बीच संदर्भ स्विचिंग है (चाहे सहकारी या प्रीemptive, चाहे एक ही पता स्थान में हों या नहीं) पंजीकरण मूल्यों को सहेजने और पुनर्स्थापित करने के लिए असेंबली कोड की आवश्यकता होती है।
असेंबली कोड स्मृति या गति के लिए कोड के छोटे बिट्स को अनुकूलित करने के लिए भी उपयोगी है। चूंकि कंपाइलर स्मार्ट हो रहे हैं, यह आजकल एप्लिकेशन स्तर पर शायद ही प्रासंगिक है, लेकिन यह अभी भी एम्बेडेड दुनिया में प्रासंगिक है।
सी के साथ असेंबली को गठबंधन करने के दो तरीके हैं: इनलाइन असेंबली के साथ, या सी मॉड्यूल के साथ असेंबली मॉड्यूल को जोड़कर। लिंकिंग तर्कसंगत रूप से क्लीनर है लेकिन हमेशा लागू नहीं होती है: कभी-कभी आपको किसी फ़ंक्शन के बीच में एक निर्देश की आवश्यकता होती है (उदाहरण के लिए एक संदर्भ स्विच पर रजिस्टर सहेजने के लिए, फ़ंक्शन कॉल रजिस्टरों को रोक देगा), या आप लागत का भुगतान नहीं करना चाहते हैं एक समारोह कॉल के।
अधिकांश सी कंपाइलर इनलाइन असेंबली का समर्थन करते हैं, लेकिन वाक्यविन्यास भिन्न होता है। यह आमतौर पर कीवर्ड asm
, _asm
, __asm
या __asm__
द्वारा प्रस्तुत किया जाता है। असेंबली कोड के अलावा, इनलाइन असेंबली निर्माण में अतिरिक्त कोड हो सकता है जो आपको असेंबली और सी के बीच मूल्यों को पारित करने की अनुमति देता है (उदाहरण के लिए, स्थानीय चर के मूल्य को प्रविष्टि पर एक रजिस्टर में कॉपी किया गया है), या घोषित करने के लिए कि विधानसभा कोड clobbers या कुछ रजिस्टरों को संरक्षित करता है।
"आपको वास्तव में यह जानने की जरूरत है कि आप क्या कर रहे हैं" पर अनुवर्ती करने के लिए। सावधानी के शब्द कि असेंबली की सटीक रेखाएं जिन्हें आप इनलाइन करना चाहते हैं, हमेशा संकलक द्वारा बिल्कुल सम्मानित नहीं होते हैं। मैंने सूक्ष्म परिवर्तन करने वाले कंपाइलर्स का अनुभव किया है। यह सुनिश्चित करने के लिए संकलन के बाद हमेशा अलग-अलग हिस्सों पर एक अच्छा नज़र डालें कि यह वास्तव में क्या कर रहा है। – BabaBooey
मेरा मानना है कि यदि आप 'अस्थिर' विनिर्देशक भी जोड़ते हैं, तो उन्हें बिल्कुल सम्मानित किया जाता है। '__asm__ अस्थिर (" instrs ");' – slugonamission
आपको यह भी जानने की ज़रूरत है कि कौन सा प्रोसेसर (परिवार) आपका कोड चल रहा है और, कुछ मामलों में, कौन सा मेमोरी मॉडल। एएनएसआई-सी लगभग किसी भी प्रोसेसर और ओएस के लिए संकलित किया जा सकता है लेकिन एएसएम निर्देश * पोर्टेबल नहीं हैं। –