इनलाइन असेंबलर
परिकलक कार्यरचना में एक इनलाइन समायोजक कुछ संकलक्स की एक विशेषता है जो संहिताांतरण भाषा में लिखे गए निम्न-स्तरीय संहिता को क्रमानुदेश के भीतर अन्य उच्च-स्तरीय भाषा से संकलित किया गया है उसे लागू करने की अनुमति देता है। उच्च-स्तरीय भाषा जैसे कि सी (कार्यरचना भाषा) या एडीए कार्यरचना भाषा।
प्रेरणा और विकल्प
संहिताांतरण भाषा संहिता की प्रवर्तन सामान्यतः इनमें से किसी एक कारण से की जाती है:[1]
- अनुकूलन (परिकलक विज्ञान): क्रमानुदेशर अपने क्रमानुदेश के कलन विधि के सबसे अधिक प्रदर्शन-संवेदनशील भागों को लागू करने के लिए संहिताांतरण भाषा संहिता का उपयोग करते हैं। संहिता जो संकलक द्वारा अन्य उत्पन्न होने की तुलना में अधिक कुशल होने के लिए उपयुक्त है।
- प्रक्रमक विशिष्ट निर्देश (परिकलक विज्ञान) तक पहुंच अधिकांश प्रक्रमक विशेष निर्देश प्रदान करते हैं जैसे तुलना-और-विनिमय और परीक्षण-और-समूह निर्देश जिनका उपयोग संकेत स्तम्भ (कार्यरचना) या अन्य तादात्म्य और पाशन आदि बनाने के लिए किया जा सकता है। प्राय: हर आधुनिक प्रक्रमक में ये या एमएमएक्स (निर्देश समूह) हैं, चूंकि वे परिकलक बहुकार्य को लागू करने के लिए आवश्यक होते हैं। विशेष निर्देशों के उदाहरण एस पी ए आर सी दृश्य निर्देश समुच्चय, इंटेल एमएमएक्स (अनुदेश समूह) और स्ट्रीमिंग एस आई एम डी वृद्धि और मोटोरोला अल्टिवेक अनुदेश समूह में पाए जाते हैं।
- विशेष आजीविका सम्मेलनों तक पहुंच अभी तक संकलक द्वारा समर्थित नहीं है।
- प्रणाली आवाहन और अवरोध उच्च-स्तरीय भाषाओं में संभवतः ही कभी मनमानी प्रणाली आवाहन करने की सीधी सुविधा होती है, इसलिए संहिताांतरण संहिता का उपयोग किया जाता है। प्रत्यक्ष व्यवधान और भी कम ही आपूर्ति किए जाते हैं।
- संयोजक या समायोजक के लिए विशेष निर्देशों का उत्सर्जन करने के लिए उदाहरण प्रतिभाग, मैक्रोज़ को बदलने या प्रतीक उपनाम बनाने के लिए है।
इनलाइन समायोजक संकलक के लिए एक स्थिति बन जाती है चूंकि यह विश्लेषण जो प्रत्येक चर के लिए क्या किया जाता है इसको जटिल बनाता है, पंजीकृत अंश का एक महत्वपूर्ण भाग है।[2] इसका अर्थ है कि प्रदर्शन वास्तव में घट सकता है। इनलाइन समायोजक भविष्य में पोर्टिंग और क्रमानुदेश के देखभाल को भी जटिल बनाता है।[1]
संकलक और क्रमानुदेशर दोनों के लिए काम को सरल बनाने के तरीके के रूप में वैकल्पिक सुविधाएं अधिकांशतः प्रदान की जाती हैं। विशेष निर्देशों के लिए आंतरिक कार्य अधिकांश संकलकों द्वारा प्रदान किए जाते हैं और मनमाना प्रणाली आवाहन के लिए सी-फंक्शन रैपर हर यूनिक्स मंच पर उपलब्ध हैं।
वाक्यविन्यास
भाषा मानकों में
आईएसओ सी ++ मानक और आईएसओ सी मानक (अनुबंध जे) इनलाइन समायोजक के लिए सशर्त रूप से समर्थित वाक्यविन्यास निर्दिष्ट करते हैं:
एएसएम-घोषणा:
एएसएम ( शाब्दिक शृंखला ) ; एएसएम घोषणा सशर्त समर्थित है; इसका अर्थ कार्यान्वयन-परिभाषित है।[3]
चूंकि, यह परिभाषा वास्तविक सी में संभवतः ही कभी प्रयोग की जाती है। यह एक साथ बहुत उदार (व्याख्या में) और बहुत प्रतिबंधित है (सिर्फ एक शृंखला शाब्दिक के उपयोग में)।
वास्तविक संकलक में
व्यावहारिक उपयोग में, मूल्यों पर चलने वाली इनलाइन संहिताांतरण मुक्त-अस्थायी संहिता के रूप में संभवतः ही खुद को साबित करती है। चूंकि क्रमानुदेशर यह अनुमान नहीं लगाया जा सकता है कि एक चर को किस पंजीकृत को अभिहस्तांकित किया गया है, इसलिए संकलक सामान्यतः उन्हें एक वृद्धि के रूप में स्थानापन्न करने का एक विधि प्रदान करते हैं।
सामान्यतः, सी/सी ++ संकलक द्वारा समर्थित दो प्रकार की इनलाइन संहिताांतरण होती है:
- एएसएम (या __एएसएम__) जीएनयू संकलक संग्रह में जीसीसी आईएसओ नियमों के प्रत्यक्ष विस्तार का उपयोग करता है। संहिताांतरण संहिता नमूना शृंखला्स में लिखा जाता है, जिसमें निवेश, निष्पाद और पुंपक्षी पंजीकृतों को कोलन में शृंखला्स के पश्चात निर्दिष्ट किया जाता है। सी चर सीधे उपयोग किए जाते हैं जबकि पंजीकृत नाम शृंखला अक्षर के रूप में उद्धृत किए जाते हैं।[4]
- __एएसएम माइक्रोसॉफ्ट विजुअल सी ++ (एम एस वी सी ), बोरलैंड/एम्बरकाडेरो सी संकलक और वंशजों में यह वाक्यविन्यास आईएसओ नियमों पर बिल्कुल भी आधारित नहीं है। क्रमानुदेशर सी वाक्यविन्यास के अनुरूप बिना किसी खंड के अंदर एएसएम लिखते हैं। चर जैसे कि वे पंजीकृत हैं और कुछ सी अभिव्यक्ति की अनुमति है।[5] हाथ संकलक में इसी प्रकार की सुविधा हुआ करती हैं।[6]
वृद्धि के दो परिवार इनलाइन संहिताांतरण प्रसंस्करण में श्रम विभाजन की भिन्न-भिन्न समझ का प्रतिनिधित्व करते हैं। जीसीसी फॉर्म भाषा के समग्र वाक्य-विन्यास को संरक्षित करता है और यह बताता है कि संकलक को क्या जानने की जरूरत है: क्या जरूरत है और क्या बदला है। निर्देश नामों को समझने के लिए संकलक को स्पष्ट रूप से इसकी आवश्यकता नहीं होती है, चूंकि संकलक को सिर्फ अपने पंजीकृत असाइनमेंट को प्रतिस्थापित करने की आवश्यकता होती है, साथ ही कुछ mov संचालन, निवेश आवश्यकताओं को संभालने के लिए। चूंकि, उपयोगकर्ता सामान्ड पंजीकृतों को गलत तरीके से निर्दिष्ट करने के लिए प्रवण है। एक लागूेड डोमेन-विशिष्ट भाषा का एमएसवीसी फॉर्म लिखने में आसानी प्रदान करता है, लेकिन इसके लिए संकलक को ओपसंहिता नामों और उनके सामानिंग गुणों के बारे में जानने की आवश्यकता होती है, देखभाल और पोर्टिंग में अतिरिक्त ध्यान देने की आवश्यकता होती है।[7] निर्देश समूह के ज्ञान के साथ सामान गलतियों के लिए जीसीसी-शैली संहिताांतरण की जांच करना अभी भी संभव है।[8] जी एन ऐ टी (जीसीसी सुइट का एडीए भाषा अग्रीकृत), और एल एल वी एम जीसीसी वाक्यविन्यास का उपयोग करता है।[9][10] डी कार्यरचना भाषा आधिकारिक तौर पर x86_64 के लिए एम एस वी सी वृद्धि के समान डीएसएल का उपयोग करती है,[11] लेकिन एलएलवीएम-आधारित एलडीसी हर आर्किटेक्चर पर जीसीसी-शैली वाक्यविन्यास भी प्रदान करता है।[12] एमएसवीसी सिर्फ 32-बिट x86 पर इनलाइन समायोजक का समर्थन करता है।[5]
अस्वस्थ भाषा तब से एलएलवीएम (जीसीसी-शैली) संस्करण की तुलना में इनलाइन संहिताांतरण विकल्पों को भिन्न करने वाले वाक्यविन्यास में उपनिवेश हो गई है। यदि पश्च सिरा लागू किया गया संहिताांतरण को सँभाल नहीं सकता है तो यह खंड को बाहरी रूप से इकट्ठा किए गए फलन में बदलने की अनुमति देने के लिए पर्याप्त जानकारी प्रदान करता है।[7]
उदाहरण
जीसीसी में एक प्रणाली आवाहन
एक ऑपरेटिंग सिस्टम को सीधे कॉल करना सामान्यतः सुरक्षित मेमोरी का उपयोग करने वाले सिस्टम के अनुसार संभव नहीं है। ओएस उपयोगकर्ता (उपयोगकर्ता मोड) की तुलना में अधिक विशेषाधिकार प्राप्त स्तर (कर्नेल मोड) पर चलता है; ऑपरेटिंग सिस्टम के लिए अनुरोध करने के लिए a (सॉफ़्टवेयर) बाधा डालना का उपयोग किया जाता है। उच्च-स्तरीय भाषा में यह संभवतः ही कभी एक विशेषता है, और इसलिए प्रणाली आवाहन के लिए आवरण समारोह इनलाइन समायोजक का उपयोग करके लिखे गए हैं।
निम्नलिखित सी संहिता उदाहरण जीएनयू समायोजक का उपयोग करके एटी एंड टी वाक्यविन्यास | एटी एंड टी समायोजक वाक्यविन्यास में x86 प्रणाली आवाहन रैपर दिखाता है। ऐसी कॉल सामान्यतः मैक्रोज़ की सहायता से लिखी जाती हैं; पूरा संहिता स्पष्टता के लिए सम्मलित किया गया है। इस विशेष स्थितियों में, रैपर कॉल करने वाले द्वारा तीन ऑपरेंड के साथ दिए गए नंबर का एक प्रणाली आवाहन करता है, परिणाम लौटाता है।[13] संक्षेप में, जीसीसी मौलिक और विस्तारित संहिताांतरण दोनों का समर्थन करता है। पूर्व बस संहिताांतरक को पाठ शब्दशः पास करता है, जबकि पश्चात वाला पंजीकृत स्थानों के लिए कुछ प्रतिस्थापन करता है।[4]
<वाक्यविन्यास प्रकाश लैंग = सी> बाहरी int errno;
int syscall3 (int संख्या, int arg1, int arg2, int arg3) {
इंट रेस; __asm__ ( int $0x80 /* OS से अनुरोध करें */ : =a (res), /* रिटर्न परिणाम eax में (ए) */ +b (arzg1), /* ebx में arg1 पास करें ( b ) [एक + निष्पाद के रूप में चूंकि syscall इसे बदल सकता है] */ +c (arg2), /* ecx में arg2 पास करें ( c ) [ditto] */ +d (arg3) /* edx में arg3 पास करें ( d ) [ditto] */ : a (num) /* eax में प्रणाली आवाहन नंबर पास करें (a) */ ): मेमोरी, सीसी, / * संकलक को घोषणा करें कि मेमोरी और कंडीशन संहिता संशोधित किए गए हैं * / ईएसआई, एडी, ईबीपी); /* इन पंजीकृतों को बंद कर दिया गया है [syscall द्वारा बदला गया] भी */
/* ऑपरेटिंग सिस्टम त्रुटि पर एक नकारात्मक मान लौटाएगा; * रैपर त्रुटि पर -1 लौटाते हैं और इरनो ग्लोबल वैरिएबल समूह करते हैं */ यदि (-125 <= रेस && रेस <0) { इरनो = -रेस; रेस = -1; } वापसी रेस;
}
</वाक्यविन्यास हाइलाइट>
x86_64 जैसे आधुनिक आर्किटेक्चर में, syscall का उपयोग करना चाहिए [14]
प्रलेखन में निवेश त्रुटिहीन हैं [15]
आर्किटेक्चर के अनुसार रिटर्न वैल्यू दो पंजीकृतों पर हो सकती है
<वाक्यविन्यास लैंग = सी लाइन = 1>
- सम्मलित <errno.h>
लंबा int syscall3 (अहस्ताक्षरित पूर्णांक संख्या, int arg1, int arg2, int arg3) {
int retA, retB; लंबा इंट रिट; एएसएम (syscall\n\t : = ए (रेटए), = डी (रेटबी) : ए (संख्या), डी (आर्ग3), डी (आर्ग1), एस (आर्ग2) : सीसी, मेमोरी ); रेट = रेटा; / * यहाँ, सिर्फ एक * / यदि (-125 <= ret && ret <0) { इरर्नो = -रेत; रेट = -1; } वापसी रिट;
} </वाक्यविन्यास हाइलाइट>
=== डी === में प्रक्रमक-विशिष्ट निर्देश डी कार्यरचना भाषा से इनलाइन संहिताांतरण का यह उदाहरण संहिता दिखाता है जो x86 के अस्थायी पॉइंट यूनिट (x87) निर्देशों का उपयोग करके x के स्पर्शरेखा की गणना करता है।
<वाक्यविन्यास प्रकाश लैंग = डी> // x की स्पर्शरेखा की गणना करें असली तन (असली एक्स) {
एएसएम { एफएलडी एक्स [ईबीपी]; // लोड एक्स एफएक्सएएम; // ऑडबॉल मूल्यों के लिए परीक्षण एफएसटीएसडब्ल्यू एएक्स; सहफ; जेसी ट्राइगर; // C0 = 1: x NAN, अनंत या खाली है // 387 डीनॉर्मल्स को संभाल सकते हैं
SC18: fptan;
एफ़एसटीपी एसटी (0); // डंप एक्स, जो निरंतर 1 होता है एफएसटीएसडब्ल्यू एएक्स; सहफ; // if (!(fp_status & 0x20)) गोटो Lret जेएनपी लरेट; // C2 = 1: x सीमा से बाहर है, तर्क में कमी करें एफएलडीपीआई; // लोड पाई एफएक्ससीएच;
SC17: fprem1; // अनुस्मारक (आंशिक)
एफएसटीएसडब्ल्यू एएक्स; सहफ; जेपी एससी 17; // C2 = 1: आंशिक अनुस्मारक, लूप करने की आवश्यकता है एफ़एसटीपी एसटी(1); // पाई को ढेर से हटा दें जेएमपी एससी 18; }
ट्रिगर:
वापसी असली.नान;
Lret: // मैन्युअल रूप से कुछ भी वापस करने की आवश्यकता नहीं है चूंकि मान पहले से ही FP स्टैक पर है
;
} </वाक्यविन्यास हाइलाइट>
पाठकों के लिए x87 कार्यरचना से अपरिचित, fstsw-sahf सशर्त कूद मुहावरे के पश्चात x87 FPU स्थिति शब्द बिट्स C0 और C2 तक पहुँचने के लिए उपयोग किया जाता है। fstsw स्थिति को सामान्यतः-उद्देश्य पंजीकृत में संग्रहीत करता है; sahf FLAGS पंजीकृत को पंजीकृत के उच्च 8 बिट्स पर समूह करता है; और एफपीयू स्थिति बिट के अनुरूप होने वाले किसी भी ध्वज बिट पर निर्णय लेने के लिए कूद का उपयोग किया जाता है।[16]
संदर्भ
- ↑ 1.0 1.1 "DontUseInlineAsm". GCC Wiki. Retrieved 21 January 2020.
- ↑ Striegel, Ben (13 January 2020). ""To a compiler, a blob of inline assembly is like a slap in the face."". Reddit. Retrieved 15 January 2020.
- ↑ C++, [dcl.asm]
- ↑ 4.0 4.1 "Extended Asm - Assembler Instructions with C Expression Operands". Using the GNU C Compiler. Retrieved 15 January 2020.
- ↑ 5.0 5.1 "Inline Assembler". docs.microsoft.com (in English).
- ↑ "Migration and Compatibility Guide: Inline assembly with Arm Compiler 6".
- ↑ 7.0 7.1 d'Antras, Amanieu (13 December 2019). "Rust RFC-2873: stable inline asm". Retrieved 15 January 2020.
However it is possible to implement support for inline assembly without support from the compiler backend by using an external assembler instead.
Pull Request for status tracking - ↑ "⚙ D54891 [RFC] Checking inline assembly for validity". reviews.llvm.org.
- ↑ "LLVM Language Reference: Inline assembly expressions". LLVM Documentation. Retrieved 15 January 2020.
- ↑ "Inline Assembly". Rust Documentation (1.0.0). Retrieved 15 January 2020.
- ↑ "Inline Assembler". D programming language. Retrieved 15 January 2020.
- ↑ "LDC inline assembly expressions". D Wiki. Retrieved 15 January 2020.
- ↑ Linux Programmer's Manual – System Calls –
- ↑ "Linux System Call Table for x86 64 · Ryan A. Chapman".
- ↑ "Syscall(2) - Linux manual page".
- ↑ "FSTSW/FNSTSW — Store x87 FPU Status Word".
The FNSTSW AX form of the instruction is used primarily in conditional branching...