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

From Vigyanwiki
No edit summary
No edit summary
Line 30: Line 30:
* {{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|__एएसएम}} माइक्रोसॉफ्ट विजुअल सी ++ (एम एस वी सी ), बोरलैंड/एम्बरकाडेरो सी संकलक और वंशजों में यह वाक्यविन्यास आईएसओ नियमों पर बिल्कुल भी आधारित नहीं है। क्रमानुदेशर सी वाक्यविन्यास के अनुरूप बिना किसी खंड के अंदर एएसएम लिखते हैं। चर जैसे कि वे पंजीकृत हैं और कुछ सी अभिव्यक्ति की अनुमति है।<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>
जी एन ऐ टी  (जीसीसी सुइट का एडीए भाषा अग्रीकृत), और [[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/>
जी एन ऐ टी  (जीसीसी सुइट का एडीए भाषा अग्रीकृत), और [[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/>
Line 39: Line 39:
जीसीसी में एक प्रणाली आवाहन
जीसीसी में एक प्रणाली आवाहन


एक ऑपरेटिंग सिस्टम को सीधे कॉल करना सामान्यतः सुरक्षित मेमोरी का उपयोग करने वाले सिस्टम के अनुसार संभव नहीं है। ओएस उपयोगकर्ता (उपयोगकर्ता मोड) की तुलना में अधिक विशेषाधिकार प्राप्त स्तर (कर्नेल मोड) पर चलता है; ऑपरेटिंग सिस्टम के लिए अनुरोध करने के लिए 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 (arzg1), /* 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>





Revision as of 20:08, 28 February 2023

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

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

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


बाहरी संबंध