इनपुट और आउटपुट

इनपुट और आउटपुट

सभी इनपुट और आउटपुट को संभालता है। एक (environment call) ऑपरेटिंग सिस्टम या सिम्युलेटर से आपके assembly कोड के लिए एक सेवा करने के लिए कहता है। स्क्रीन और कीबोर्ड इस तरह उपलब्ध दो सेवाएँ हैं।

a7 में सर्विस नंबर डालें, a0 में कोई भी तर्क डालें, फिर ट्रिगर करें। इस सिम्युलेटर को ये सेवाएँ ज्ञात हैं:

सेवाएँ (a7)
1 # पूर्णांक प्रिंट करें (a0 = संख्या)
4 # स्ट्रिंग प्रिंट करें (a0 = टेक्स्ट का पता)
5 # पूर्णांक पढ़ें (परिणाम a0 में लौटाया जाता है)
10 # प्रोग्राम बंद करें
32 # सोएँ (a0 = मिलीसेकंड)
सेवा कॉल
कार्यक्रम
a71
a0मूल्य
ecall
सिस्टमएक संख्या प्रिंट करता है

a7 = 1 प्रिंट सेवा चुनता है।

हर सेवा एक ही दो-रजिस्टर हैंडशेक साझा करती है। a7 बताता है कि कौन सी सेवा चलानी है, और a0 वह सब कुछ ले जाता है जिसकी उस सेवा को ज़रूरत होती है: प्रिंट करने के लिए एक मान, पढ़ने के लिए एक पता, प्रतीक्षा करने की एक अवधि। यह सूची निश्चित और छोटी है, इसमें पाँच प्रविष्टियाँ हैं, इसलिए इस हैंडशेक को एक बार सीख लेने से यह सिम्युलेटर बाहरी दुनिया से संवाद करने के हर तरीके को समझा जा सकता है। एक वास्तविक ऑपरेटिंग सिस्टम इसी विचार को एक बहुत लंबी सूची तक बढ़ाता है।
एक संख्या पढ़ें, उसे दोगुना करें, उसे प्रिंट करें
li a7, 5 # पूर्णांक पढ़ें -> a0
ecall
add a0, a0, a0 # इसे दोगुना करें
li a7, 1 # पूर्णांक प्रिंट करें
ecall
li a7, 10
ecall

पूर्णांक पढ़ना चुनता है और इनपुट के लिए रुकता है, आपकी संख्या a0 में लौटाता है। a0 को स्वयं में जोड़ता है, उसे यथास्थान दोगुना कर देता है। फिर और परिणाम प्रिंट करते हैं, और और बाहर निकलते हैं। जब आप इसे Run करते हैं, सिम्युलेटर एक इनपुट बॉक्स दिखाता है। एक संख्या टाइप करें और देखें कि वह दोगुनी होकर वापस आती है।

टेक्स्ट प्रिंट करना

सबसे पहले दो नए शब्द। एक सेक्शन आपके प्रोग्राम का एक लेबल किया गया क्षेत्र है: निर्देश .text सेक्शन में रहते हैं, जबकि टेक्स्ट जैसे स्थिर डेटा का निवास .data सेक्शन में होता है। और एक पता केवल एक संख्या है जो मेमोरी में एक स्लॉट की पहचान करती है। पूरी स्ट्रिंग को साथ ले जाने के बजाय, एक रजिस्टर उस पते को ले जा सकता है जहाँ स्ट्रिंग शुरू होती है, और प्रिंट सेवा वहीं से पढ़ती है।

टेक्स्ट डेटा सेक्शन में जाता है। आप उससे एक लेबल संलग्न करते हैं, फिर उस लेबल का पता लोड करने के लिए ("लोड एड्रेस") का उपयोग करते हैं और उसे प्रिंट करने के लिए सर्विस 4 का उपयोग करते हैं।

नमस्ते, RISC-V
.data
msg: .string "Hello, RISC-V!\n"
.text
la a0, msg # a0 = टेक्स्ट का पता
li a7, 4 # स्ट्रिंग प्रिंट करें
ecall
li a7, 10
ecall

.data में, डायरेक्टिव टेक्स्ट के लिए जगह आरक्षित करता है और लेबल msg संलग्न करता है। .string अक्षरों को संग्रहीत करता है और \n, एक न्यूलाइन, जोड़ता है। .text में, टेक्स्ट का पता a0 में डालता है, प्रिंट-स्ट्रिंग सर्विस चुनता है, और उस पते से अक्षरों को तब तक प्रिंट करता है जब तक वह स्ट्रिंग के अंत तक नहीं पहुँच जाता। फिर प्रोग्राम सामान्य रूप से बाहर निकल जाता है।