ecall

ecall

تجميع RISC-V مرجع

يغطي lyszt.net ecall وتعليمات RISC-V الأخرى بمزيد من التفصيل.

الوصف

يطلب ecall من البيئة التي يعمل فيها برنامجك أداء خدمة. يمكن للتجميع جمع الأرقام ونقلها، لكن الشاشة ولوحة المفاتيح والأجهزة الأخرى تنتمي إلى النظام الذي يستضيف البرنامج، لذا لا يمكن للشيفرة الوصول إليها بمفردها. ecall اختصار لـ environment call (استدعاء البيئة). يوقف شيفرتك، وينفذ المضيف الخدمة، ثم تعود السيطرة إلى شيفرتك. المضيف هو نظام تشغيل على عتاد حقيقي، وفي هذا المحاكي هو المحاكي نفسه.

يحدد البرنامج الخدمة التي يريدها. حسب العرف، يوضع رقم الخدمة في a7، وأي بيانات تحتاجها الخدمة توضع في a0، ثم يُنفَّذ ecall. يقدم هذا المحاكي هذه الخدمات: 1 يطبع العدد الصحيح في a0، و4 يطبع النص عند العنوان في a0، و5 يقرأ رقماً من الإدخال إلى a0، و10 ينهي البرنامج، و32 يتوقف مؤقتاً لمدة a0 ميلي ثانية.

لطباعة رقم، حمّل 1 في a7 لاختيار خدمة الطباعة، وحمّل الرقم في a0، ثم نفّذ ecall. يفعل المثال ذلك. الخدمة 10 تنهي البرنامج، ولهذا تنتهي الدروس بالسطرين أدناه. بدونها يستمر المعالج بعد السطر الأخير إلى whatever يأتي بعده.

li a7, 10
ecall

يذكر دليل RISC-V أن ecall يقدم طلب خدمة إلى بيئة التنفيذ، وأن البيئة تقرر كيفية تمرير المعاملات، عادةً في سجلات أعداد صحيحة محددة. هذا المحاكي هو البيئة هنا وهو يحدد أرقام الخدمات المذكورة أعلاه. يلاحظ الدليل أيضاً أن ecall كان يُسمى سابقاً scall. أما رفيقه ebreak فيعيد السيطرة إلى مصحح الأخطاء. كلاهما يرفع فخاً دقيقاً مطلوباً إلى البيئة.

يعمل نظام التشغيل الكامل بالطريقة نفسها، مع قائمة أطول من الخدمات.

مثال

li a7, 1     # service 1 = print integer
li a0, 42
ecall        # prints 42