मुख्य कंटेंट तक स्किप करें

इनलाइन असेंबली

परिचय

यह दस्तावेज़ Wave भाषा के इनलाइन असेंबली के बारे में बताता है। इनलाइन असेंबली Wave द्वारा प्रदान की जाने वाली सुविधाओं में से एक है, जो उच्च स्तरीय भाषा की सुविधा को बनाए रखते हुए कम स्तरीय हार्डवेयर नियंत्रण तक सीधे पहुँचने की अनुमति देता है।

अर्थात, यह सामान्य Wave कोड के लिए कठिन रजिस्टर प्रबंधन, मेमोरी तक सीधे पहुंच, विशेष कमांड के निष्पादन आदि को संभव बनाता है और प्रदर्शन अनुकूलन या हार्डवेयर पर निर्भर कार्यों की आवश्यकता होने पर यह उपयोगी होता है।


मूल व्याकरण

asm {
"एसेंबली निर्देश" // वास्तविक एसेंबली कोड (प्रत्येक पंक्ति में एक निर्देश)
...
in("रजिस्टर") मान // इनपुट रजिस्टर मैपिंग
out("रजिस्टर") चर // आउटपुट रजिस्टर मैपिंग
}

व्याकरण तत्व

  1. एसेंबली निर्देश

    • "..." स्ट्रिंग के रूप में लिखा गया है, और यह सीपीयू में चलने वाला कम-स्तरीय एसेंबली निर्देश है।
    • कई पंक्तियाँ लिखी जा सकती हैं, प्रत्येक पंक्ति में एक निर्देश होता है।
    • उदाहरण:
      "mov rax, 1"
      "syscall"
  2. in("रजिस्टर") मान

    • चर (या अभिव्यक्ति) के मान को निर्दिष्ट रजिस्टर में लोड करता है।
    • उदाहरण:
      in("rdi") s
      -> चर s का मान x86-64 कन्वेंशन में पहले syscall तर्क रजिस्टर rdi में डालता है।
  3. out("रजिस्टर") चर

    • निर्दिष्ट रजिस्टर के मान को Wave चर में लाता है।
    • उदाहरण:
      out("rax") ret
      -> syscall की रिटर्न वैल्यू स्टोर किए गए rax रजिस्टर के मान को चर ret में संग्रहीत करता है।

सरल उदाहरण

fun main() {
var msg_ptr: ptr<i8> = "Hello from syscall!\n";
var ret_val: i64;

asm {
"mov rax, 1"
"syscall"
in("rdi") 1
in("rsi") msg_ptr
in("rdx") 20
out("rax") ret_val
}
}

सावधानियाँ

  • इनलाइन असेंबली Wave की प्रकार स्थिरता को बायपास करती है, इसलिए गलत असेंबली उपयोग से प्रोग्राम का असामान्य समापन या अपरिभाषित व्यवहार हो सकता है।
  • in, out मैपिंग संकलन समय पर सत्यापित किए जाते हैं, लेकिन निर्देशों की अपनी मान्यता की गारंटी नहीं देते।