الإدخال والإخراج
تتعامل مع جميع المدخلات والمخرجات. يطلب (environment call) من نظام التشغيل أو المحاكي أداء خدمة لشيفرة التجميع الخاصة بك. الشاشة ولوحة المفاتيح هما اثنتان من الخدمات المتاحة بهذه الطريقة.
ضع رقم الخدمة في a7، وأي وسيط في a0، ثم قم بتشغيل . الخدمات التي يعرفها هذا المحاكي:
1 # طباعة عدد صحيح (a0 = الرقم)4 # طباعة سلسلة نصية (a0 = عنوان النص)5 # قراءة عدد صحيح (تُعاد النتيجة في a0)10 # إنهاء البرنامج32 # تعليق (a0 = مللي ثانية)
a7 = 1 يحدد خدمة الطباعة.
a7 إلى الخدمة المطلوب تشغيلها، بينما يحمل a0 كل ما تحتاجه تلك الخدمة: قيمة للطباعة، أو عنوان للقراءة منه، أو مدة الانتظار. القائمة ثابتة وقصيرة، وتتألف من خمسة عناصر، لذا فإن تعلم هذه العملية مرة واحدة يغطي كل الطرق التي يتواصل بها هذا المحاكي مع العالم الخارجي. ويوسع نظام التشغيل الحقيقي هذه الفكرة لتشمل قائمة أطول بكثير.li a7, 5 # قراءة عدد صحيح -> a0ecalladd a0, a0, a0 # ضاعفهli a7, 1 # طباعة عدد صحيحecallli a7, 10ecall
يختار قراءة عدد صحيح، ويوقف التنفيذ بانتظار الإدخال، ثم يعيد رقمك في a0. ويضيف قيمة a0 إلى نفسها، فيضاعفها في مكانها. ثم يطبع و النتيجة، ويخرج و. عند تشغيله عبر Run، تظهر نافذة إدخال في المحاكي. اكتب رقمًا وشاهده يعود مضاعفًا.
طباعة النص
أولاً، كلمتان جديدتان. القسم هو منطقة محددة في البرنامج: توجد التعليمات في قسم .text، بينما توجد البيانات الثابتة مثل النص في قسم .data. أما العنوان فهو مجرد رقم يحدد خانة واحدة في الذاكرة. بدلاً من حمل سلسلة كاملة، يمكن للسجل أن يحمل العنوان الذي تبدأ منه السلسلة، وتقوم خدمة الطباعة بالقراءة من هناك.
يوضع النص في قسم البيانات. تُرفق به تسمية، ثم تستخدم ("load address") لتحميل عنوان تلك التسمية والخدمة 4 لطباعته.
.datamsg: .string "Hello, RISC-V!\n".textla a0, msg # a0 = عنوان النصli a7, 4 # طباعة سلسلة نصيةecallli a7, 10ecall
في .data، تحجز التوجيهة مساحةً للنص وترفق التسمية msg. يخزّن .string المحارف ويضيف \n، وهو سطر جديد. في .text، يضع عنوان النص في a0، ويختار خدمة طباعة السلسلة، ويطبع المحارف من ذلك العنوان حتى يبلغ نهاية السلسلة. ثم يخرج البرنامج كالمعتاد.
