इनलाइन असेंबलर: Difference between revisions

From Vigyanwiki
(Created page with "कंप्यूटर प्रोग्रामिंग में, एक इनलाइन असेंबलर कुछ संकलक्स की एक...")
 
No edit summary
 
(5 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[कंप्यूटर प्रोग्रामिंग]] में, एक इनलाइन असेंबलर कुछ [[संकलक]]्स की एक विशेषता है जो असेंबली भाषा में लिखे गए निम्न-स्तरीय कोड को प्रोग्राम के भीतर एम्बेड करने की अनुमति देता है, कोड के बीच जो अन्यथा उच्च-स्तरीय भाषा से संकलित किया गया है। उच्च-स्तरीय भाषा जैसे कि C (प्रोग्रामिंग लैंग्वेज) या Ada प्रोग्रामिंग लैंग्वेज।
[[Index.php?title=परिकलक कार्यरचना|परिकलक कार्यरचना]] में एक इनलाइन समायोजक कुछ [[संकलक]] की एक विशेषता है जो असेंबली लैंग्वेज में लिखे गए निम्न-स्तरीय संहिता को क्रमानुदेश के भीतर अन्य उच्च-स्तरीय लैंग्वेज से संकलित किया गया है उसे लागू करने की अनुमति देता है। उच्च-स्तरीय लैंग्वेज जैसे कि C (कार्यरचना लैंग्वेज) या एडीए कार्यरचना लैंग्वेज।


== प्रेरणा और विकल्प ==
== प्रेरणा और विकल्प ==
असेंबली लैंग्वेज कोड की एम्बेडिंग आमतौर पर इनमें से किसी एक कारण से की जाती है:<ref name=gcc-dont>{{cite web |title=DontUseInlineAsm |url=https://gcc.gnu.org/wiki/DontUseInlineAsm |website=GCC Wiki |access-date=21 January 2020}}</ref>
असेंबली लैंग्वेज संहिता की प्रवर्तन सामान्यतः इनमें से किसी एक कारण से की जाती है:<ref name=gcc-dont>{{cite web |title=DontUseInlineAsm |url=https://gcc.gnu.org/wiki/DontUseInlineAsm |website=GCC Wiki |access-date=21 January 2020}}</ref>
* [[अनुकूलन (कंप्यूटर विज्ञान)]]: प्रोग्रामर अपने प्रोग्राम के [[कलन विधि]] के सबसे अधिक प्रदर्शन-संवेदनशील भागों को लागू करने के लिए असेंबली भाषा कोड का उपयोग कर सकते हैं, कोड जो संकलक द्वारा अन्यथा उत्पन्न होने की तुलना में अधिक कुशल होने के लिए उपयुक्त है।
* [[अनुकूलन (कंप्यूटर विज्ञान)|अनुकूलन (परिकलक विज्ञान)]]: क्रमानुदेशर अपने क्रमानुदेश के [[कलन विधि]] के सबसे अधिक प्रदर्शन-संवेदनशील भागों को लागू करने के लिए असेंबली लैंग्वेज संहिता का उपयोग करते हैं। संहिता जो संकलक द्वारा अन्य उत्पन्न होने की तुलना में अधिक कुशल होने के लिए उपयुक्त है।
* प्रोसेसर विशिष्ट [[निर्देश (कंप्यूटर विज्ञान)]] तक पहुंच: अधिकांश प्रोसेसर विशेष निर्देश प्रदान करते हैं, जैसे तुलना-और-स्वैप और परीक्षण-और-सेट निर्देश जिनका उपयोग [[सेमाफोर (प्रोग्रामिंग)]] या अन्य सिंक्रनाइज़ेशन और लॉकिंग आदिम बनाने के लिए किया जा सकता है। लगभग हर आधुनिक प्रोसेसर में ये या [[एमएमएक्स (निर्देश सेट)]] हैं, क्योंकि वे [[कंप्यूटर मल्टीटास्किंग]] को लागू करने के लिए आवश्यक होते हैं। विशेष निर्देशों के उदाहरण [[SPARC]] विज़ुअल [[निर्देश समुच्चय]], [[Intel]] MMX (इंस्ट्रक्शन सेट) और [[स्ट्रीमिंग SIMD एक्सटेंशन]] और [[Motorola]] [[Altivec]] इंस्ट्रक्शन सेट में पाए जाते हैं।
* प्रक्रमक विशिष्ट [[निर्देश (कंप्यूटर विज्ञान)|निर्देश (परिकलक विज्ञान)]] तक पहुंच अधिकांश प्रक्रमक विशेष निर्देश प्रदान करते हैं जैसे तुलना-और-विनिमय और परीक्षण-और-समूह निर्देश जिनका उपयोग [[Index.php?title=संकेत स्तम्भ (प्रोग्रामिंग)|संकेत स्तम्भ (कार्यरचना)]] या अन्य तादात्म्य और पाशन आदि बनाने के लिए किया जा सकता है। प्राय: हर आधुनिक प्रक्रमक में ये या [[एमएमएक्स (निर्देश सेट)|एमएमएक्स (निर्देश समूह)]] हैं, चूंकि वे [[Index.php?title=परिकलक बहुकार्य|परिकलक बहुकार्य]] को लागू करने के लिए आवश्यक होते हैं। विशेष निर्देशों के उदाहरण [[Index.php?title=एस पी ए आर सी|एस पी ए आर सी]] दृश्य [[निर्देश समुच्चय]], इंटेल एमएमएक्स (अनुदेश समूह) और [[Index.php?title=स्ट्रीमिंग एस आई एम डी एक्सटेंशन|स्ट्रीमिंग एस आई एम डी वृद्धि]] और मोटोरोला अल्टिवेक अनुदेश समूह में पाए जाते हैं।
* विशेष कॉलिंग सम्मेलनों तक पहुंच अभी तक संकलक द्वारा समर्थित नहीं है।
* विशेष आजीविका सम्मेलनों तक पहुंच अभी तक संकलक द्वारा समर्थित नहीं है।
* [[सिस्टम कॉल]] और इंटरप्ट: उच्च-स्तरीय भाषाओं में शायद ही कभी मनमानी सिस्टम कॉल करने की सीधी सुविधा होती है, इसलिए असेंबली कोड का उपयोग किया जाता है। प्रत्यक्ष व्यवधान और भी कम ही आपूर्ति किए जाते हैं।
* [[Index.php?title=प्रणाली आवाहन|प्रणाली आवाहन]] और अवरोध उच्च-स्तरीय लैंग्वेजओं में संभवतः ही कभी मनमानी प्रणाली आवाहन करने की सीधी सुविधा होती है, इसलिए संहिताांतरण संहिता का उपयोग किया जाता है। प्रत्यक्ष व्यवधान और भी कम ही आपूर्ति किए जाते हैं।
* लिंकर या असेंबलर के लिए विशेष निर्देशों का उत्सर्जन करने के लिए, उदाहरण के लिए सेक्शनिंग, मैक्रोज़ को बदलने या प्रतीक उपनाम बनाने के लिए।
* संयोजक या समायोजक के लिए विशेष निर्देशों का उत्सर्जन करने के लिए उदाहरण प्रतिभाग, मैक्रोज़ को बदलने या प्रतीक उपनाम बनाने के लिए है।


दूसरी ओर, इनलाइन असेंबलर कंपाइलर के लिए एक सीधी समस्या बन जाता है क्योंकि यह विश्लेषण को जटिल बनाता है कि प्रत्येक चर के लिए क्या किया जाता है, जो रजिस्टर आवंटन का एक महत्वपूर्ण हिस्सा है।<ref>{{cite web |last1=Striegel |first1=Ben |title="To a compiler, a blob of inline assembly is like a slap in the face."|url=https://www.reddit.com/r/rust/comments/eo9pks/the_asm_working_group_has_submitted_their_first/feb7yy4/ |website=Reddit |date=13 January 2020 |access-date=15 January 2020}}</ref> इसका मतलब है कि प्रदर्शन वास्तव में घट सकता है। इनलाइन असेंबलर भविष्य में पोर्टिंग और प्रोग्राम के रखरखाव को भी जटिल बनाता है।<ref name=gcc-dont/>
इनलाइन समायोजक संकलक के लिए एक स्थिति बन जाती है चूंकि यह विश्लेषण जो प्रत्येक चर के लिए क्या किया जाता है इसको जटिल बनाता है, पंजीकृत अंश का एक महत्वपूर्ण भाग है।<ref>{{cite web |last1=Striegel |first1=Ben |title="To a compiler, a blob of inline assembly is like a slap in the face."|url=https://www.reddit.com/r/rust/comments/eo9pks/the_asm_working_group_has_submitted_their_first/feb7yy4/ |website=Reddit |date=13 January 2020 |access-date=15 January 2020}}</ref> इसका अर्थ है कि प्रदर्शन वास्तव में घट सकता है। इनलाइन समायोजक भविष्य में पोर्टिंग और क्रमानुदेश के देखभाल को भी जटिल बनाता है।<ref name=gcc-dont/>


कंपाइलर और प्रोग्रामर दोनों के लिए काम को सरल बनाने के तरीके के रूप में वैकल्पिक सुविधाएं अक्सर प्रदान की जाती हैं। विशेष निर्देशों के लिए [[आंतरिक कार्य]] अधिकांश कंपाइलरों द्वारा प्रदान किए जाते हैं और मनमाना सिस्टम कॉल के लिए सी-फंक्शन रैपर हर [[यूनिक्स]] प्लेटफॉर्म पर उपलब्ध हैं।
संकलक और क्रमानुदेशर दोनों के लिए काम को सरल बनाने के तरीके के रूप में वैकल्पिक सुविधाएं अधिकांशतः प्रदान की जाती हैं। विशेष निर्देशों के लिए [[आंतरिक कार्य]] अधिकांश संकलकों द्वारा प्रदान किए जाते हैं और मनमाना प्रणाली आवाहन के लिए सी-फंक्शन रैपर हर [[यूनिक्स]] मंच पर उपलब्ध हैं।


== सिंटेक्स ==
== वाक्यविन्यास ==


=== भाषा मानकों में ===
=== लैंग्वेज मानकों में ===
ISO C++ मानक और ISO C मानक (अनुबंध J) इनलाइन असेंबलर के लिए सशर्त रूप से समर्थित सिंटैक्स निर्दिष्ट करते हैं:
आईएसओ सी ++ मानक और आईएसओ सी मानक (अनुबंध जे) इनलाइन समायोजक के लिए सशर्त रूप से समर्थित वाक्यविन्यास निर्दिष्ट करते हैं:
<ब्लॉककोट><कविता>
एक asm डिक्लेरेशन का फॉर्म है
   एएसएम-घोषणा:     
   एएसएम-घोषणा:     
{{mono|asm}} ( शाब्दिक स्ट्रिंग ) ;
{{mono|एएसएम}} ( शाब्दिक शृंखला ) ;
एएसएम घोषणा सशर्त समर्थित है; इसका अर्थ कार्यान्वयन-परिभाषित है।<ref>C++, [dcl.asm]</ref>
एएसएम घोषणा सशर्त समर्थित है; इसका अर्थ कार्यान्वयन-परिभाषित है।<ref>C++, [dcl.asm]</ref>
</कविता></ब्लॉककोट>


हालांकि, यह परिभाषा वास्तविक सी में शायद ही कभी प्रयोग की जाती है, क्योंकि यह एक साथ बहुत उदार (व्याख्या में) और बहुत प्रतिबंधित है (केवल एक स्ट्रिंग शाब्दिक के उपयोग में)।
चूंकि, यह परिलैंग्वेज वास्तविक सी में संभवतः ही कभी प्रयोग की जाती है। यह एक साथ बहुत उदार (व्याख्या में) और बहुत प्रतिबंधित है (सिर्फ एक शृंखला शाब्दिक के उपयोग में)।


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


सामान्य तौर पर, C/C++ कंपाइलर द्वारा समर्थित दो प्रकार की इनलाइन असेंबली होती है:
सामान्यतः, सी/सी ++ संकलक द्वारा समर्थित दो प्रकार की इनलाइन संहिताांतरण होती है:
* {{tt|asm}} (या {{tt|__asm__}}) जीएनयू कंपाइलर संग्रह में। जीसीसी आईएसओ नियमों के प्रत्यक्ष विस्तार का उपयोग करता है: असेंबली कोड टेम्प्लेट स्ट्रिंग्स में लिखा जाता है, जिसमें इनपुट, आउटपुट और क्लोबर्ड रजिस्टरों को कोलन में स्ट्रिंग्स के बाद निर्दिष्ट किया जाता है। सी चर सीधे उपयोग किए जाते हैं जबकि रजिस्टर नाम स्ट्रिंग अक्षर के रूप में उद्धृत किए जाते हैं।<ref name=GCCEXT>{{cite web |title=Extended Asm - Assembler Instructions with C Expression Operands |url=https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html |website=Using the GNU C Compiler |access-date=15 January 2020}}</ref>
* {{tt|एएसएम}} (या {{tt|_एएसएम_}}) जीएनयू संकलक संग्रह में जीसीसी आईएसओ नियमों के प्रत्यक्ष विस्तार का उपयोग करता है। संहिताांतरण संहिता नमूना शृंखला्स में लिखा जाता है, जिसमें निवेश, निष्पाद और पुंपक्षी पंजीकृतों को कोलन में शृंखला्स के पश्चात निर्दिष्ट किया जाता है। सी चर सीधे उपयोग किए जाते हैं जबकि पंजीकृत नाम शृंखला अक्षर के रूप में उद्धृत किए जाते हैं।<ref name=GCCEXT>{{cite web |title=Extended Asm - Assembler Instructions with C Expression Operands |url=https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html |website=Using the GNU C Compiler |access-date=15 January 2020}}</ref>
* {{tt|__asm}} Microsoft [[Visual C++]] (MSVC), Borland/Embarcadero C कंपाइलर और वंशजों में। यह सिंटैक्स आईएसओ नियमों पर बिल्कुल भी आधारित नहीं है; प्रोग्रामर सी सिंटैक्स के अनुरूप बिना किसी ब्लॉक के अंदर एएसएम लिखते हैं। वेरिएबल्स उपलब्ध हैं जैसे कि वे रजिस्टर हैं और कुछ सी एक्सप्रेशन की अनुमति है।<ref name=msvc>{{cite web |title=Inline Assembler |url=https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler |website=docs.microsoft.com |language=en-us}}</ref> [[ARM Compiler]] में इसी तरह की सुविधा हुआ करती थी।<ref>{{Cite web|url=https://www.keil.com/support/man/docs/armclang_mig/armclang_mig_ioz1485879652178.htm|title=Migration and Compatibility Guide: Inline assembly with Arm Compiler 6}}</ref>
* {{tt|_एएसएम}} माइक्रोसॉफ्ट विजुअल सी ++ (एम एस वी सी ), बोरलैंड/एम्बरकाडेरो सी संकलक और वंशजों में यह वाक्यविन्यास आईएसओ नियमों पर बिल्कुल भी आधारित नहीं है। क्रमानुदेशर सी वाक्यविन्यास के अनुरूप बिना किसी खंड के अंदर एएसएम लिखते हैं। चर जैसे कि वे पंजीकृत हैं और कुछ सी अभिव्यक्ति की अनुमति है।<ref name=msvc>{{cite web |title=Inline Assembler |url=https://docs.microsoft.com/en-us/cpp/assembler/inline/inline-assembler |website=docs.microsoft.com |language=en-us}}</ref> [[Index.php?title=हाथ संकलक|हाथ संकलक]] में इसी प्रकार की सुविधा हुआ करती हैं।<ref>{{Cite web|url=https://www.keil.com/support/man/docs/armclang_mig/armclang_mig_ioz1485879652178.htm|title=Migration and Compatibility Guide: Inline assembly with Arm Compiler 6}}</ref>
एक्सटेंशन के दो परिवार इनलाइन असेंबली प्रसंस्करण में श्रम विभाजन की अलग-अलग समझ का प्रतिनिधित्व करते हैं। जीसीसी फॉर्म भाषा के समग्र वाक्य-विन्यास को संरक्षित करता है और यह बताता है कि संकलक को क्या जानने की जरूरत है: क्या जरूरत है और क्या बदला है। निर्देश नामों को समझने के लिए संकलक को स्पष्ट रूप से इसकी आवश्यकता नहीं होती है, क्योंकि संकलक को केवल अपने रजिस्टर असाइनमेंट को प्रतिस्थापित करने की आवश्यकता होती है, साथ ही कुछ {{tt|mov}} संचालन, इनपुट आवश्यकताओं को संभालने के लिए। हालाँकि, उपयोगकर्ता क्लॉबर्ड रजिस्टरों को गलत तरीके से निर्दिष्ट करने के लिए प्रवण है। एक एम्बेडेड [[डोमेन-विशिष्ट भाषा]] का एमएसवीसी फॉर्म लिखने में आसानी प्रदान करता है, लेकिन इसके लिए कंपाइलर को ओपकोड नामों और उनके क्लॉबरिंग गुणों के बारे में जानने की आवश्यकता होती है, रखरखाव और पोर्टिंग में अतिरिक्त ध्यान देने की आवश्यकता होती है।<ref name=rust-asm>{{cite web |last1=d'Antras |first1=Amanieu |title=Rust RFC-2873: stable inline asm |url=https://rust-lang.github.io/rfcs/2873-inline-asm.html |access-date=15 January 2020 |date=13 December 2019|quote=However it is possible to implement support for inline assembly without support from the compiler backend by using an external assembler instead. }} [https://github.com/rust-lang/rfcs/pull/2850 Pull Request for status tracking]</ref> निर्देश सेट के ज्ञान के साथ क्लॉबर गलतियों के लिए जीसीसी-शैली असेंबली की जांच करना अभी भी संभव है।<ref>{{cite web |title=⚙ D54891 [RFC] Checking inline assembly for validity |url=https://reviews.llvm.org/D54891 |website=reviews.llvm.org}}</ref>
वृद्धि के दो परिवार इनलाइन संहिताांतरण प्रसंस्करण में श्रम विभाजन की भिन्न-भिन्न समझ का प्रतिनिधित्व करते हैं। जीसीसी फॉर्म लैंग्वेज के समग्र वाक्य-विन्यास को संरक्षित करता है और यह बताता है कि संकलक को क्या जानने की जरूरत है: क्या जरूरत है और क्या बदला है। निर्देश नामों को समझने के लिए संकलक को स्पष्ट रूप से इसकी आवश्यकता नहीं होती है, चूंकि संकलक को सिर्फ अपने पंजीकृत असाइनमेंट को प्रतिस्थापित करने की आवश्यकता होती है, साथ ही कुछ {{tt|mov}} संचालन, निवेश आवश्यकताओं को संभालने के लिए। चूंकि, उपयोगकर्ता सामान्ड पंजीकृतों को गलत तरीके से निर्दिष्ट करने के लिए प्रवण है। एक लागूेड [[डोमेन-विशिष्ट भाषा|डोमेन-विशिष्ट लैंग्वेज]] का एमएसवीसी फॉर्म लिखने में आसानी प्रदान करता है, लेकिन इसके लिए संकलक को ओपसंहिता नामों और उनके सामानिंग गुणों के बारे में जानने की आवश्यकता होती है, देखभाल और पोर्टिंग में अतिरिक्त ध्यान देने की आवश्यकता होती है।<ref name=rust-asm>{{cite web |last1=d'Antras |first1=Amanieu |title=Rust RFC-2873: stable inline asm |url=https://rust-lang.github.io/rfcs/2873-inline-asm.html |access-date=15 January 2020 |date=13 December 2019|quote=However it is possible to implement support for inline assembly without support from the compiler backend by using an external assembler instead. }} [https://github.com/rust-lang/rfcs/pull/2850 Pull Request for status tracking]</ref> निर्देश समूह के ज्ञान के साथ सामान गलतियों के लिए जीसीसी-शैली संहिताांतरण की जांच करना अभी भी संभव है।<ref>{{cite web |title=⚙ D54891 [RFC] Checking inline assembly for validity |url=https://reviews.llvm.org/D54891 |website=reviews.llvm.org}}</ref>
GNAT (GCC सुइट का Ada भाषा फ्रंटएंड), और [[LLVM]] GCC सिंटैक्स का उपयोग करता है।<ref>{{cite web |title=LLVM Language Reference: Inline assembly expressions |url=http://llvm.org/docs/LangRef.html#inline-assembler-expressions |website=LLVM Documentation |access-date=15 January 2020}}</ref><ref>{{cite web |title=Inline Assembly |url=https://doc.rust-lang.org/1.0.0/book/inline-assembly.html |website=Rust Documentation (1.0.0) |access-date=15 January 2020}}</ref> D प्रोग्रामिंग भाषा आधिकारिक तौर पर x86_64 के लिए MSVC एक्सटेंशन के समान DSL का उपयोग करती है,<ref>{{cite web |title=Inline Assembler |url=https://dlang.org/spec/iasm.html |website=D programming language |access-date=15 January 2020}}</ref> लेकिन एलएलवीएम-आधारित एलडीसी हर आर्किटेक्चर पर जीसीसी-शैली सिंटैक्स भी प्रदान करता है।<ref>{{cite web |title=LDC inline assembly expressions |url=https://wiki.dlang.org/LDC_inline_assembly_expressions |website=D Wiki |access-date=15 January 2020}}</ref> एमएसवीसी केवल 32-बिट x86 पर इनलाइन असेंबलर का समर्थन करता है।<ref name=msvc/>
जी एन ऐ टी  (जीसीसी सुइट का एडीए लैंग्वेज अग्रीकृत), और [[Index.php?title=एल एल वी एम|एल एल वी एम]] जीसीसी वाक्यविन्यास का उपयोग करता है।<ref>{{cite web |title=LLVM Language Reference: Inline assembly expressions |url=http://llvm.org/docs/LangRef.html#inline-assembler-expressions |website=LLVM Documentation |access-date=15 January 2020}}</ref><ref>{{cite web |title=Inline Assembly |url=https://doc.rust-lang.org/1.0.0/book/inline-assembly.html |website=Rust Documentation (1.0.0) |access-date=15 January 2020}}</ref> डी कार्यरचना लैंग्वेज आधिकारिक तौर पर x86_64 के लिए एम एस वी सी  वृद्धि के समान डीएसएल का उपयोग करती है,<ref>{{cite web |title=Inline Assembler |url=https://dlang.org/spec/iasm.html |website=D programming language |access-date=15 January 2020}}</ref> लेकिन एलएलवीएम-आधारित एलडीसी हर वास्तुकला पर जीसीसी-शैली वाक्यविन्यास भी प्रदान करता है।<ref>{{cite web |title=LDC inline assembly expressions |url=https://wiki.dlang.org/LDC_inline_assembly_expressions |website=D Wiki |access-date=15 January 2020}}</ref> एमएसवीसी सिर्फ 32-बिट x86 पर इनलाइन समायोजक का समर्थन करता है।<ref name=msvc/>


रस्ट भाषा तब से एलएलवीएम (जीसीसी-शैली) संस्करण की तुलना में इनलाइन असेंबली विकल्पों को अलग करने वाले सिंटैक्स में माइग्रेट हो गई है। यदि बैकएंड एम्बेडेड असेंबली को हैंडल नहीं कर सकता है तो यह ब्लॉक को बाहरी रूप से असेंबल किए गए फ़ंक्शन में बदलने की अनुमति देने के लिए पर्याप्त जानकारी प्रदान करता है।<ref name=rust-asm/>
अस्वस्थ लैंग्वेज तब से एलएलवीएम (जीसीसी-शैली) संस्करण की तुलना में इनलाइन संहिताांतरण विकल्पों को भिन्न करने वाले वाक्यविन्यास में उपनिवेश हो गई है। यदि पश्‍च सिरा लागू किया गया संहिताांतरण को सँभाल नहीं सकता है तो यह खंड को बाहरी रूप से इकट्ठा किए गए फलन में बदलने की अनुमति देने के लिए पर्याप्त जानकारी प्रदान करता है।<ref name=rust-asm/>




== उदाहरण ==
== उदाहरण ==


=== जीसीसी === में एक सिस्टम कॉल
जीसीसी में एक प्रणाली आवाहन


एक ऑपरेटिंग सिस्टम को सीधे कॉल करना आम तौर पर सुरक्षित मेमोरी का उपयोग करने वाले सिस्टम के तहत संभव नहीं है। ओएस उपयोगकर्ता (उपयोगकर्ता मोड) की तुलना में अधिक विशेषाधिकार प्राप्त स्तर (कर्नेल मोड) पर चलता है; ऑपरेटिंग सिस्टम के लिए अनुरोध करने के लिए a (सॉफ़्टवेयर) [[बाधा डालना]] का उपयोग किया जाता है। उच्च-स्तरीय भाषा में यह शायद ही कभी एक विशेषता है, और इसलिए सिस्टम कॉल के लिए [[आवरण समारोह]] इनलाइन असेंबलर का उपयोग करके लिखे गए हैं।
एक प्रचालन प्रणाली को सीधे आवाहन करना सामान्यतः सुरक्षित धारणा का उपयोग करने वाले प्रणाली के अनुसार संभव नहीं है। प्रचालन प्रणाली उपयोगकर्ता (आधुनिक उपयोगकर्ता) की तुलना में अधिक विशेषाधिकार प्राप्त स्तर (कर्नेल आधुनिक) पर चलता है; प्रचालन प्रणाली के लिए अनुरोध करने के लिए (सॉफ़्टवेयर) [[बाधा डालना|बाधा डालने]] का उपयोग करता है। उच्च-स्तरीय लैंग्वेज में यह एक विशेषता है, और इसलिए प्रणाली आवाहन के लिए [[आवरण समारोह]] इनलाइन समायोजक का उपयोग करके लिखा गया हैं।


निम्नलिखित सी कोड उदाहरण [[जीएनयू असेंबलर]] का उपयोग करके एटी एंड टी सिंटैक्स | एटी एंड टी असेंबलर सिंटैक्स में x86 सिस्टम कॉल रैपर दिखाता है। ऐसी कॉल सामान्यतया मैक्रोज़ की सहायता से लिखी जाती हैं; पूरा कोड स्पष्टता के लिए शामिल किया गया है। इस विशेष मामले में, रैपर कॉल करने वाले द्वारा तीन ऑपरेंड के साथ दिए गए नंबर का एक सिस्टम कॉल करता है, परिणाम लौटाता है।<ref>{{man|2|syscall|Linux}}</ref>
निम्नलिखित सी संहिता उदाहरण [[जीएनयू असेंबलर|जीएनयू समायोजक]] का उपयोग करके एटी तथा टी वाक्यविन्यास, एटी तथा टी समायोजक वाक्यविन्यास में x86 प्रणाली आवाहन रैपर दिखाता है। ऐसी आवाहन सामान्यतः मैक्रोज़ की सहायता से लिखी जाती हैं; पूरा संहिता स्पष्टता के लिए सम्मलित किया गया है। इस विशेष स्थितियों में, रैपर आवाहन करने वाले द्वारा तीन ऑपरेंड के साथ दिए गए नंबर का एक प्रणाली आवाहन करता है तथा परिणाम लौटाता है।<ref>{{man|2|syscall|Linux}}</ref> जीसीसी मौलिक और विस्तारित संहिताांतरण दोनों का समर्थन करता है। पूर्व संहिताांतरक को पाठ शब्दशः पास करता है, जबकि पश्चात वाला पंजीकृत स्थानों के लिए कुछ प्रतिस्थापन करता है।<ref name=GCCEXT/><syntaxhighlight lang="c">
संक्षेप में, जीसीसी बुनियादी और विस्तारित असेंबली दोनों का समर्थन करता है। पूर्व बस कोडांतरक को पाठ शब्दशः पास करता है, जबकि बाद वाला रजिस्टर स्थानों के लिए कुछ प्रतिस्थापन करता है।<ref name=GCCEXT/>
extern int errno;


<वाक्यविन्यास प्रकाश लैंग = सी>
int syscall3(int num, int arg1, int arg2, int arg3)
बाहरी int errno;
 
int syscall3 (int संख्या, int arg1, int arg2, int arg3)
{
{
   इंट रेस;
   int res;
   __asm__ (
   __asm__ (
    int $0x80 /* OS से अनुरोध करें */
    "int $0x80"        /* make the request to the OS */
     : =a (res), /* रिटर्न परिणाम eax में () */
     : "=a" (res),     /* return result in eax ("a") */
      +b (arg1), /* ebx में arg1 पास करें ( b ) [एक + आउटपुट के रूप में क्योंकि syscall इसे बदल सकता है] */
      "+b" (arg1),     /* pass arg1 in ebx ("b") [as a "+" output because the syscall may change it] */
      +c (arg2), /* ecx में arg2 पास करें ( c ) [ditto] */
      "+c" (arg2),     /* pass arg2 in ecx ("c") [ditto] */
      +d (arg3) /* edx में arg3 पास करें ( d ) [ditto] */
      "+d" (arg3)     /* pass arg3 in edx ("d") [ditto] */
     : a (num) /* eax में सिस्टम कॉल नंबर पास करें (a) */
     : "a(num)       /* pass system call number in eax ("a") */
     : मेमोरी, सीसी, / * कंपाइलर को घोषणा करें कि मेमोरी और कंडीशन कोड संशोधित किए गए हैं * /
     : "memory", "cc", /* announce to the compiler that the memory and condition codes have been modified */
      ईएसआई, एडी, ईबीपी); /* इन रजिस्टरों को बंद कर दिया गया है [syscall द्वारा बदला गया] भी */
      "esi", "edi", "ebp"); /* these registers are clobbered [changed by the syscall] too */


   /* ऑपरेटिंग सिस्टम त्रुटि पर एक नकारात्मक मान लौटाएगा;
   /* The operating system will return a negative value on error;
   * रैपर त्रुटि पर -1 लौटाते हैं और इरनो ग्लोबल वैरिएबल सेट करते हैं */
   * wrappers return -1 on error and set the errno global variable */
   अगर (-125 <= रेस && रेस <0) {
   if (-125 <= res && res < 0) {
     इरनो = -रेस;
     errno = -res;
     रेस = -1;
     res  = -1;
   }
   }
   वापसी रेस;
   return res;
}
}
</syntaxhighlight>विन्यास हाइलाइट जैसे आधुनिक वास्तुकला में, सिसकॉल का उपयोग करना चाहिए।<ref>{{Cite web|url=http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/|title=Linux System Call Table for x86 64 · Ryan A. Chapman}}</ref><br>
प्रलेखन में निवेश त्रुटिहीन हैं।<ref>{{Cite web|url=https://man7.org/linux/man-pages/man2/syscall.2.html|title = Syscall(2) - Linux manual page}}</ref> <br>
वास्तुकला के अनुसार प्रतिलाभ की मात्रा दो पंजीकृतों पर हो सकती है।<syntaxhighlight lang="c">
#include <errno.h>


</वाक्यविन्यास हाइलाइट>
long int syscall3(unsigned int num, int arg1, int arg2, int arg3){
x86_64 जैसे आधुनिक आर्किटेक्चर में, syscall का उपयोग करना चाहिए <ref>{{Cite web|url=http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/|title=Linux System Call Table for x86 64 · Ryan A. Chapman}}</ref><br>
प्रलेखन में इनपुट सटीक हैं <ref>{{Cite web|url=https://man7.org/linux/man-pages/man2/syscall.2.html|title = Syscall(2) - Linux manual page}}</ref> <br>
आर्किटेक्चर के अनुसार रिटर्न वैल्यू दो रजिस्टरों पर हो सकती है
<वाक्यविन्यास लैंग = सी लाइन = 1>
#शामिल <errno.h>
 
लंबा int syscall3 (अहस्ताक्षरित पूर्णांक संख्या, int arg1, int arg2, int arg3) {


     int retA, retB;
     int retA, retB;
     लंबा इंट रिट;
     long int ret;
     एएसएम (syscall\n\t
     asm (   "syscall\n\t"
             : = (रेटए), = डी (रेटबी)
             :"=a"(retA),"=d"(retB)  
             : (संख्या), डी (आर्ग3), डी (आर्ग1), एस (आर्ग2)
             :"a"(num),"d"(arg3),"D"(arg1),"S"(arg2)  
             : सीसी, मेमोरी
             :"cc","memory"
         );
         );
     रेट = रेटा; / * यहाँ, केवल एक * /
     ret=retA; /* here, only one */
      
      
     अगर (-125 <= ret && ret <0) {
     if (-125 <= ret && ret < 0) {
         इरर्नो = -रेत;
         errno = -ret;
         रेट = -1;
         ret  = -1;
     }
     }
     वापसी रिट;
     return ret;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 
=== डी === में प्रोसेसर-विशिष्ट निर्देश
डी प्रोग्रामिंग लैंग्वेज से इनलाइन असेंबली का यह उदाहरण कोड दिखाता है जो x[[86]] के [[फ्लोटिंग पॉइंट यूनिट]] ([[x87]]) निर्देशों का उपयोग करके x के स्पर्शरेखा की गणना करता है।


<वाक्यविन्यास प्रकाश लैंग = डी>
=== डी में संसाधक-विशिष्ट निर्देश ===
// x की स्पर्शरेखा की गणना करें
डी कार्यरचना लैंग्वेज से इनलाइन सभा का यह उदाहरण संहिता दिखाता है जो x86 के एफपीयू (x87) निर्देशों का उपयोग करके एक्स के स्पर्शरेखा की गणना करता है।<syntaxhighlight lang="c">
असली तन (असली एक्स)
// Compute the tangent of x
real tan(real x)
{
{
   एएसएम
   asm
   {
   {
       एफएलडी एक्स [ईबीपी]; // लोड एक्स
       fld    x[EBP]                 ; // load x
       एफएक्सएएम; // ऑडबॉल मूल्यों के लिए परीक्षण
       fxam                            ; // test for oddball values
       एफएसटीएसडब्ल्यू एएक्स;
       fstsw  AX                      ;
       सहफ;
       sahf                            ;
       जेसी ट्राइगर; // C0 = 1: x NAN, अनंत या खाली है
       jc      trigerr                ; // C0 = 1: x is NAN, infinity, or empty
                                         // 387 डीनॉर्मल्स को संभाल सकते हैं
                                         // 387's can handle denormals
SC18: fptan;
SC18: fptan                           ;
       एफ़एसटीपी एसटी (0); // डंप एक्स, जो हमेशा 1 होता है
       fstp    ST(0)                   ; // dump X, which is always 1
       एफएसटीएसडब्ल्यू एएक्स;
       fstsw  AX                      ;
       सहफ; // if (!(fp_status & 0x20)) गोटो Lret
       sahf                            ; // if (!(fp_status & 0x20)) goto Lret
       जेएनपी लरेट; // C2 = 1: x सीमा से बाहर है, तर्क में कमी करें
       jnp    Lret                    ; // C2 = 1: x is out of range, do argument reduction
       एफएलडीपीआई; // लोड पाई
       fldpi                          ; // load pi
       एफएक्ससीएच;
       fxch                            ;
SC17: fprem1; // अनुस्मारक (आंशिक)
SC17: fprem1                         ; // reminder (partial)
       एफएसटीएसडब्ल्यू एएक्स;
       fstsw  AX                      ;
       सहफ;
       sahf                            ;
       जेपी एससी 17; // C2 = 1: आंशिक अनुस्मारक, लूप करने की आवश्यकता है
       jp      SC17                    ; // C2 = 1: partial reminder, need to loop
       एफ़एसटीपी एसटी(1); // पाई को ढेर से हटा दें
       fstp    ST(1)                   ; // remove pi from stack
       जेएमपी एससी 18;
       jmp    SC18                    ;
   }
   }
ट्रिगर:
trigerr:
   वापसी असली.नान;
   return real.nan;
Lret: // मैन्युअल रूप से कुछ भी वापस करने की आवश्यकता नहीं है क्योंकि मान पहले से ही FP स्टैक पर है
Lret:                                   // No need to manually return anything as the value is already on FP stack
   ;
   ;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>पाठकों के लिए x87 कार्यरचना से अपरिचित, {{tt|ऍफ़एसटीएसडब्लू-एसऐएचऍफ़}} सशर्त विषयांतर मुहावरे के पश्चात x87 एफपीयू स्थिति शब्द बिट्स C0 और C2 तक पहुँचने के लिए उपयोग किया जाता है। {{tt|ऍफ़एसटीडब्लू}} स्थिति को सामान्यतः-उद्देश्य पंजीकृत में संग्रहीत करता है; एस ऐ एच ऍफ़ मुख्य पंजीकृत को उच्च आठ बिट्स पर समूह करता है; और एफपीयू स्थिति बिट के अनुरूप होने वाले किसी भी ध्वज बिट पर निर्णय लेने के लिए विषयांतर का उपयोग किया जाता है।<ref>{{cite web |title=FSTSW/FNSTSW — Store x87 FPU Status Word |url=https://www.felixcloutier.com/x86/fstsw:fnstsw |quote=The FNSTSW AX form of the instruction is used primarily in conditional branching...}}</ref>
 
पाठकों के लिए x87 प्रोग्रामिंग से अपरिचित, {{tt|fstsw-sahf}} सशर्त कूद मुहावरे के बाद x87 FPU स्थिति शब्द बिट्स C0 और C2 तक पहुँचने के लिए उपयोग किया जाता है। {{tt|fstsw}} स्थिति को सामान्य-उद्देश्य रजिस्टर में संग्रहीत करता है; sahf FLAGS रजिस्टर को रजिस्टर के उच्च 8 बिट्स पर सेट करता है; और एफपीयू स्थिति बिट के अनुरूप होने वाले किसी भी ध्वज बिट पर निर्णय लेने के लिए कूद का उपयोग किया जाता है।<ref>{{cite web |title=FSTSW/FNSTSW — Store x87 FPU Status Word |url=https://www.felixcloutier.com/x86/fstsw:fnstsw |quote=The FNSTSW AX form of the instruction is used primarily in conditional branching...}}</ref>




Line 142: Line 129:


== बाहरी संबंध ==
== बाहरी संबंध ==
*[http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html GCC-Inline-Assembly-HOWTO]
*[http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html जीसीसी-Inline-Assembly-HOWTO]
*[http://clang.llvm.org/compatibility.html#inline-asm Clang Inline assembly]
*[http://clang.llvm.org/compatibility.html#inline-asm Clang Inline assembly]
*[https://gcc.gnu.org/onlinedocs/gnat_ugn/Inline-Assembler.html GNAT Inline Assembler]
*[https://gcc.gnu.org/onlinedocs/gnat_ugn/Inline-Assembler.html जी एन ऐ टी  Inline Assembler]
*[https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html GCC Inline Assembler Reference]
*[https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html जीसीसी Inline Assembler Reference]
*[https://gcc.godbolt.org/ Compiler Explorer]
*[https://gcc.godbolt.org/ Compiler Explorer]
[[Category: विधानसभा भाषाएँ]]


[[Category: Machine Translated Page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 17/02/2023]]
[[Category:Created On 17/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:विधानसभा भाषाएँ]]

Latest revision as of 16:35, 2 March 2023

परिकलक कार्यरचना में एक इनलाइन समायोजक कुछ संकलक की एक विशेषता है जो असेंबली लैंग्वेज में लिखे गए निम्न-स्तरीय संहिता को क्रमानुदेश के भीतर अन्य उच्च-स्तरीय लैंग्वेज से संकलित किया गया है उसे लागू करने की अनुमति देता है। उच्च-स्तरीय लैंग्वेज जैसे कि C (कार्यरचना लैंग्वेज) या एडीए कार्यरचना लैंग्वेज।

प्रेरणा और विकल्प

असेंबली लैंग्वेज संहिता की प्रवर्तन सामान्यतः इनमें से किसी एक कारण से की जाती है:[1]

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

इनलाइन समायोजक संकलक के लिए एक स्थिति बन जाती है चूंकि यह विश्लेषण जो प्रत्येक चर के लिए क्या किया जाता है इसको जटिल बनाता है, पंजीकृत अंश का एक महत्वपूर्ण भाग है।[2] इसका अर्थ है कि प्रदर्शन वास्तव में घट सकता है। इनलाइन समायोजक भविष्य में पोर्टिंग और क्रमानुदेश के देखभाल को भी जटिल बनाता है।[1]

संकलक और क्रमानुदेशर दोनों के लिए काम को सरल बनाने के तरीके के रूप में वैकल्पिक सुविधाएं अधिकांशतः प्रदान की जाती हैं। विशेष निर्देशों के लिए आंतरिक कार्य अधिकांश संकलकों द्वारा प्रदान किए जाते हैं और मनमाना प्रणाली आवाहन के लिए सी-फंक्शन रैपर हर यूनिक्स मंच पर उपलब्ध हैं।

वाक्यविन्यास

लैंग्वेज मानकों में

आईएसओ सी ++ मानक और आईएसओ सी मानक (अनुबंध जे) इनलाइन समायोजक के लिए सशर्त रूप से समर्थित वाक्यविन्यास निर्दिष्ट करते हैं:

 एएसएम-घोषणा:     

एएसएम ( शाब्दिक शृंखला ) ; एएसएम घोषणा सशर्त समर्थित है; इसका अर्थ कार्यान्वयन-परिभाषित है।[3]

चूंकि, यह परिलैंग्वेज वास्तविक सी में संभवतः ही कभी प्रयोग की जाती है। यह एक साथ बहुत उदार (व्याख्या में) और बहुत प्रतिबंधित है (सिर्फ एक शृंखला शाब्दिक के उपयोग में)।

वास्तविक संकलक में

व्यावहारिक उपयोग में, मूल्यों पर चलने वाली इनलाइन संहिताांतरण मुक्त-अस्थायी संहिता के रूप में संभवतः ही खुद को साबित करती है। चूंकि क्रमानुदेशर यह अनुमान नहीं लगाया जा सकता है कि एक चर को किस पंजीकृत को अभिहस्तांकित किया गया है, इसलिए संकलक सामान्यतः उन्हें एक वृद्धि के रूप में स्थानापन्न करने का एक विधि प्रदान करते हैं।

सामान्यतः, सी/सी ++ संकलक द्वारा समर्थित दो प्रकार की इनलाइन संहिताांतरण होती है:

  • एएसएम (या _एएसएम_) जीएनयू संकलक संग्रह में जीसीसी आईएसओ नियमों के प्रत्यक्ष विस्तार का उपयोग करता है। संहिताांतरण संहिता नमूना शृंखला्स में लिखा जाता है, जिसमें निवेश, निष्पाद और पुंपक्षी पंजीकृतों को कोलन में शृंखला्स के पश्चात निर्दिष्ट किया जाता है। सी चर सीधे उपयोग किए जाते हैं जबकि पंजीकृत नाम शृंखला अक्षर के रूप में उद्धृत किए जाते हैं।[4]
  • _एएसएम माइक्रोसॉफ्ट विजुअल सी ++ (एम एस वी सी ), बोरलैंड/एम्बरकाडेरो सी संकलक और वंशजों में यह वाक्यविन्यास आईएसओ नियमों पर बिल्कुल भी आधारित नहीं है। क्रमानुदेशर सी वाक्यविन्यास के अनुरूप बिना किसी खंड के अंदर एएसएम लिखते हैं। चर जैसे कि वे पंजीकृत हैं और कुछ सी अभिव्यक्ति की अनुमति है।[5] हाथ संकलक में इसी प्रकार की सुविधा हुआ करती हैं।[6]

वृद्धि के दो परिवार इनलाइन संहिताांतरण प्रसंस्करण में श्रम विभाजन की भिन्न-भिन्न समझ का प्रतिनिधित्व करते हैं। जीसीसी फॉर्म लैंग्वेज के समग्र वाक्य-विन्यास को संरक्षित करता है और यह बताता है कि संकलक को क्या जानने की जरूरत है: क्या जरूरत है और क्या बदला है। निर्देश नामों को समझने के लिए संकलक को स्पष्ट रूप से इसकी आवश्यकता नहीं होती है, चूंकि संकलक को सिर्फ अपने पंजीकृत असाइनमेंट को प्रतिस्थापित करने की आवश्यकता होती है, साथ ही कुछ mov संचालन, निवेश आवश्यकताओं को संभालने के लिए। चूंकि, उपयोगकर्ता सामान्ड पंजीकृतों को गलत तरीके से निर्दिष्ट करने के लिए प्रवण है। एक लागूेड डोमेन-विशिष्ट लैंग्वेज का एमएसवीसी फॉर्म लिखने में आसानी प्रदान करता है, लेकिन इसके लिए संकलक को ओपसंहिता नामों और उनके सामानिंग गुणों के बारे में जानने की आवश्यकता होती है, देखभाल और पोर्टिंग में अतिरिक्त ध्यान देने की आवश्यकता होती है।[7] निर्देश समूह के ज्ञान के साथ सामान गलतियों के लिए जीसीसी-शैली संहिताांतरण की जांच करना अभी भी संभव है।[8] जी एन ऐ टी (जीसीसी सुइट का एडीए लैंग्वेज अग्रीकृत), और एल एल वी एम जीसीसी वाक्यविन्यास का उपयोग करता है।[9][10] डी कार्यरचना लैंग्वेज आधिकारिक तौर पर x86_64 के लिए एम एस वी सी वृद्धि के समान डीएसएल का उपयोग करती है,[11] लेकिन एलएलवीएम-आधारित एलडीसी हर वास्तुकला पर जीसीसी-शैली वाक्यविन्यास भी प्रदान करता है।[12] एमएसवीसी सिर्फ 32-बिट x86 पर इनलाइन समायोजक का समर्थन करता है।[5]

अस्वस्थ लैंग्वेज तब से एलएलवीएम (जीसीसी-शैली) संस्करण की तुलना में इनलाइन संहिताांतरण विकल्पों को भिन्न करने वाले वाक्यविन्यास में उपनिवेश हो गई है। यदि पश्‍च सिरा लागू किया गया संहिताांतरण को सँभाल नहीं सकता है तो यह खंड को बाहरी रूप से इकट्ठा किए गए फलन में बदलने की अनुमति देने के लिए पर्याप्त जानकारी प्रदान करता है।[7]


उदाहरण

जीसीसी में एक प्रणाली आवाहन

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

निम्नलिखित सी संहिता उदाहरण जीएनयू समायोजक का उपयोग करके एटी तथा टी वाक्यविन्यास, एटी तथा टी समायोजक वाक्यविन्यास में x86 प्रणाली आवाहन रैपर दिखाता है। ऐसी आवाहन सामान्यतः मैक्रोज़ की सहायता से लिखी जाती हैं; पूरा संहिता स्पष्टता के लिए सम्मलित किया गया है। इस विशेष स्थितियों में, रैपर आवाहन करने वाले द्वारा तीन ऑपरेंड के साथ दिए गए नंबर का एक प्रणाली आवाहन करता है तथा परिणाम लौटाता है।[13] जीसीसी मौलिक और विस्तारित संहिताांतरण दोनों का समर्थन करता है। पूर्व संहिताांतरक को पाठ शब्दशः पास करता है, जबकि पश्चात वाला पंजीकृत स्थानों के लिए कुछ प्रतिस्थापन करता है।[4]

extern int errno;

int syscall3(int num, int arg1, int arg2, int arg3)
{
  int res;
  __asm__ (
    "int $0x80"        /* make the request to the OS */
    : "=a" (res),      /* return result in eax ("a") */
      "+b" (arg1),     /* pass arg1 in ebx ("b") [as a "+" output because the syscall may change it] */
      "+c" (arg2),     /* pass arg2 in ecx ("c") [ditto] */
      "+d" (arg3)      /* pass arg3 in edx ("d") [ditto] */
    : "a"  (num)       /* pass system call number in eax ("a") */
    : "memory", "cc",  /* announce to the compiler that the memory and condition codes have been modified */
      "esi", "edi", "ebp"); /* these registers are clobbered [changed by the syscall] too */

  /* The operating system will return a negative value on error;
   * wrappers return -1 on error and set the errno global variable */
  if (-125 <= res && res < 0) {
    errno = -res;
    res   = -1;
  }
  return res;
}

विन्यास हाइलाइट जैसे आधुनिक वास्तुकला में, सिसकॉल का उपयोग करना चाहिए।[14]

प्रलेखन में निवेश त्रुटिहीन हैं।[15]

वास्तुकला के अनुसार प्रतिलाभ की मात्रा दो पंजीकृतों पर हो सकती है।

#include <errno.h>

long int syscall3(unsigned int num, int arg1, int arg2, int arg3){

    int retA, retB;
    long int ret;
    asm (   "syscall\n\t"
            :"=a"(retA),"=d"(retB) 
            :"a"(num),"d"(arg3),"D"(arg1),"S"(arg2) 
            :"cc","memory"
        );
    ret=retA; /* here, only one */
    
    if (-125 <= ret && ret < 0) {
        errno = -ret;
        ret   = -1;
    }
    return ret;
}

डी में संसाधक-विशिष्ट निर्देश

डी कार्यरचना लैंग्वेज से इनलाइन सभा का यह उदाहरण संहिता दिखाता है जो x86 के एफपीयू (x87) निर्देशों का उपयोग करके एक्स के स्पर्शरेखा की गणना करता है।

// Compute the tangent of x
real tan(real x)
{
   asm
   {
       fld     x[EBP]                  ; // load x
       fxam                            ; // test for oddball values
       fstsw   AX                      ;
       sahf                            ;
       jc      trigerr                 ; // C0 = 1: x is NAN, infinity, or empty
                                         // 387's can handle denormals
SC18:  fptan                           ;
       fstp    ST(0)                   ; // dump X, which is always 1
       fstsw   AX                      ;
       sahf                            ; // if (!(fp_status & 0x20)) goto Lret
       jnp     Lret                    ; // C2 = 1: x is out of range, do argument reduction
       fldpi                           ; // load pi
       fxch                            ;
SC17:  fprem1                          ; // reminder (partial)
       fstsw   AX                      ;
       sahf                            ;
       jp      SC17                    ; // C2 = 1: partial reminder, need to loop 
       fstp    ST(1)                   ; // remove pi from stack
       jmp     SC18                    ;
   }
trigerr:
   return real.nan;
Lret:                                    // No need to manually return anything as the value is already on FP stack
   ;
}

पाठकों के लिए x87 कार्यरचना से अपरिचित, ऍफ़एसटीएसडब्लू-एसऐएचऍफ़ सशर्त विषयांतर मुहावरे के पश्चात x87 एफपीयू स्थिति शब्द बिट्स C0 और C2 तक पहुँचने के लिए उपयोग किया जाता है। ऍफ़एसटीडब्लू स्थिति को सामान्यतः-उद्देश्य पंजीकृत में संग्रहीत करता है; एस ऐ एच ऍफ़ मुख्य पंजीकृत को उच्च आठ बिट्स पर समूह करता है; और एफपीयू स्थिति बिट के अनुरूप होने वाले किसी भी ध्वज बिट पर निर्णय लेने के लिए विषयांतर का उपयोग किया जाता है।[16]


संदर्भ

  1. 1.0 1.1 "DontUseInlineAsm". GCC Wiki. Retrieved 21 January 2020.
  2. 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.
  3. C++, [dcl.asm]
  4. 4.0 4.1 "Extended Asm - Assembler Instructions with C Expression Operands". Using the GNU C Compiler. Retrieved 15 January 2020.
  5. 5.0 5.1 "Inline Assembler". docs.microsoft.com (in English).
  6. "Migration and Compatibility Guide: Inline assembly with Arm Compiler 6".
  7. 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
  8. "⚙ D54891 [RFC] Checking inline assembly for validity". reviews.llvm.org.
  9. "LLVM Language Reference: Inline assembly expressions". LLVM Documentation. Retrieved 15 January 2020.
  10. "Inline Assembly". Rust Documentation (1.0.0). Retrieved 15 January 2020.
  11. "Inline Assembler". D programming language. Retrieved 15 January 2020.
  12. "LDC inline assembly expressions". D Wiki. Retrieved 15 January 2020.
  13. syscall(2) – Linux Programmer's Manual – System Calls
  14. "Linux System Call Table for x86 64 · Ryan A. Chapman".
  15. "Syscall(2) - Linux manual page".
  16. "FSTSW/FNSTSW — Store x87 FPU Status Word". The FNSTSW AX form of the instruction is used primarily in conditional branching...


बाहरी संबंध