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

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


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


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


<वाक्यविन्यास प्रकाश लैंग = सी>
<वाक्यविन्यास प्रकाश लैंग = सी>
Line 56: Line 53:
     int $0x80 /* OS से अनुरोध करें */
     int $0x80 /* OS से अनुरोध करें */
     : =a (res), /* रिटर्न परिणाम eax में (ए) */
     : =a (res), /* रिटर्न परिणाम eax में (ए) */
       +b (arg1), /* ebx में arg1 पास करें ( b ) [एक + आउटपुट के रूप में क्योंकि syscall इसे बदल सकता है] */
       +b (arzg1), /* ebx में arg1 पास करें ( b ) [एक + निष्पाद के रूप में चूंकि syscall इसे बदल सकता है] */
       +c (arg2), /* ecx में arg2 पास करें ( c ) [ditto] */
       +c (arg2), /* ecx में arg2 पास करें ( c ) [ditto] */
       +d (arg3) /* edx में arg3 पास करें ( d ) [ditto] */
       +d (arg3) /* edx में arg3 पास करें ( d ) [ditto] */
     : a (num) /* eax में सिस्टम कॉल नंबर पास करें (a) */
     : a (num) /* eax में प्रणाली आवाहन नंबर पास करें (a) */
    : मेमोरी, सीसी, / * कंपाइलर को घोषणा करें कि मेमोरी और कंडीशन कोड संशोधित किए गए हैं * /
  ): मेमोरी, सीसी, / * संकलक को घोषणा करें कि मेमोरी और कंडीशन संहिता संशोधित किए गए हैं * /
       ईएसआई, एडी, ईबीपी); /* इन रजिस्टरों को बंद कर दिया गया है [syscall द्वारा बदला गया] भी */
       ईएसआई, एडी, ईबीपी); /* इन पंजीकृतों को बंद कर दिया गया है [syscall द्वारा बदला गया] भी */


   /* ऑपरेटिंग सिस्टम त्रुटि पर एक नकारात्मक मान लौटाएगा;
   /* ऑपरेटिंग सिस्टम त्रुटि पर एक नकारात्मक मान लौटाएगा;
   * रैपर त्रुटि पर -1 लौटाते हैं और इरनो ग्लोबल वैरिएबल सेट करते हैं */
   * रैपर त्रुटि पर -1 लौटाते हैं और इरनो ग्लोबल वैरिएबल समूह करते हैं */
   अगर (-125 <= रेस && रेस <0) {
   यदि (-125 <= रेस && रेस <0) {
     इरनो = -रेस;
     इरनो = -रेस;
     रेस = -1;
     रेस = -1;
Line 74: Line 71:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>
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>
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>
प्रलेखन में निवेश त्रुटिहीन हैं <ref>{{Cite web|url=https://man7.org/linux/man-pages/man2/syscall.2.html|title = Syscall(2) - Linux manual page}}</ref> <br>
आर्किटेक्चर के अनुसार रिटर्न वैल्यू दो रजिस्टरों पर हो सकती है
आर्किटेक्चर के अनुसार रिटर्न वैल्यू दो पंजीकृतों पर हो सकती है
<वाक्यविन्यास लैंग = सी लाइन = 1>
<वाक्यविन्यास लैंग = सी लाइन = 1>
#शामिल <errno.h>
#सम्मलित <errno.h>


लंबा int syscall3 (अहस्ताक्षरित पूर्णांक संख्या, int arg1, int arg2, int arg3) {
लंबा int syscall3 (अहस्ताक्षरित पूर्णांक संख्या, int arg1, int arg2, int arg3) {
Line 88: Line 85:
             : सीसी, मेमोरी
             : सीसी, मेमोरी
         );
         );
     रेट = रेटा; / * यहाँ, केवल एक * /
     रेट = रेटा; / * यहाँ, सिर्फ एक * /
      
      
     अगर (-125 <= ret && ret <0) {
     यदि (-125 <= ret && ret <0) {
         इरर्नो = -रेत;
         इरर्नो = -रेत;
         रेट = -1;
         रेट = -1;
Line 98: Line 95:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


=== डी === में प्रोसेसर-विशिष्ट निर्देश
=== डी === में प्रक्रमक-विशिष्ट निर्देश
डी प्रोग्रामिंग लैंग्वेज से इनलाइन असेंबली का यह उदाहरण कोड दिखाता है जो x[[86]] के [[फ्लोटिंग पॉइंट यूनिट]] ([[x87]]) निर्देशों का उपयोग करके x के स्पर्शरेखा की गणना करता है।
डी कार्यरचना भाषा से इनलाइन संहिताांतरण का यह उदाहरण संहिता दिखाता है जो x[[86]] के [[फ्लोटिंग पॉइंट यूनिट|अस्थायी पॉइंट यूनिट]] ([[x87]]) निर्देशों का उपयोग करके x के स्पर्शरेखा की गणना करता है।


<वाक्यविन्यास प्रकाश लैंग = डी>
<वाक्यविन्यास प्रकाश लैंग = डी>
Line 114: Line 111:
                                         // 387 डीनॉर्मल्स को संभाल सकते हैं
                                         // 387 डीनॉर्मल्स को संभाल सकते हैं
SC18: fptan;
SC18: fptan;
       एफ़एसटीपी एसटी (0); // डंप एक्स, जो हमेशा 1 होता है
       एफ़एसटीपी एसटी (0); // डंप एक्स, जो निरंतर 1 होता है
       एफएसटीएसडब्ल्यू एएक्स;
       एफएसटीएसडब्ल्यू एएक्स;
       सहफ; // if (!(fp_status & 0x20)) गोटो Lret
       सहफ; // if (!(fp_status & 0x20)) गोटो Lret
Line 129: Line 126:
ट्रिगर:
ट्रिगर:
   वापसी असली.नान;
   वापसी असली.नान;
Lret: // मैन्युअल रूप से कुछ भी वापस करने की आवश्यकता नहीं है क्योंकि मान पहले से ही FP स्टैक पर है
Lret: // मैन्युअल रूप से कुछ भी वापस करने की आवश्यकता नहीं है चूंकि मान पहले से ही FP स्टैक पर है
   ;
   ;
}
}
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


पाठकों के लिए 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>
पाठकों के लिए 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 139:


== बाहरी संबंध ==
== बाहरी संबंध ==
*[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: विधानसभा भाषाएँ]]  

Revision as of 01:50, 28 February 2023

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

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

संहिताांतरण भाषा संहिता की प्रवर्तन सामान्यतः इनमें से किसी एक कारण से की जाती है:[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>

  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. 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...


बाहरी संबंध