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

From Vigyanwiki
(No difference)

Revision as of 16:15, 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...


बाहरी संबंध