call
زائفيغطي lyszt.net call وتعليمات RISC-V الأخرى بمزيد من التفصيل.
الوصف
يشغّل call دالة ويتعامل مع القيمة المُعادة. يقفز إلى الدالة ويخزّن عنوان العودة في ra، ما يتيح للدالة أن تعود. وهو تعليمة شبه حقيقية تتوسّع عادةً إلى التعليمة أدناه.
jal ra, label
عندما تكون الدالة بعيدة جدًا بحيث لا تصل إليها قفزة واحدة، يستبدل المُجمّع تسلسلًا أطول يغطي المسافة. كتابة call مع اسم الدالة تُصرّح بالقصد وتترك اختيار الصيغة للمُجمّع. يصف مدخل jal القفزة وحفظ عنوان العودة. السطر أدناه يستدعي دالة square.
call square
يتطلب استدعاء دالة أيضًا اتفاقًا على كيفية انتقال المعلومات بين المُستدعي والمُستدعى. هذا الاتفاق هو اصطلاح الاستدعاء. يضع المُستدعي مدخلات الدالة في سجلات الوسائط المسماة a0 وa1 وهكذا، ويقرأ النتيجة من a0 بعد عودة الدالة. يتبع الطرفان القاعدة نفسها، لذا تظل الشيفرة المكتوبة بشكل منفصل تعمل معًا.
كل call يكتب فوق ra. الدالة التي تُجري استدعاءات خاصة بها تحفظ قيمة ra التي تلقّتها قبل إجرائها، ثم تستعيد تلك القيمة قبل عودتها. بدون ذلك، يحل عنوان عودة الاستدعاء الداخلي محل العنوان الخارجي ولا تستطيع الدالة العودة. الدالة التي لا تستدعي أي شيء آخر لا حاجة لها بحفظ ra.
ينص دليل RISC-V على أن اصطلاح الاستدعاء البرمجي القياسي يستخدم x1 كسجل عنوان العودة. يصل jal إلى أهداف ضمن نطاق زائد أو ناقص 1 MiB، حيث 1 MiB يساوي 1,048,576 بايت. الهدف الأبعد يتطلب auipc متبوعًا بـ jalr، الذي يصل إلى أي مكان في نطاق عنوان نسبي إلى pc بطول 32 بت.
يستدعي المثال square بالقيمة 6 في a0 ويجد 36 في a0 بعد ذلك. تدخل الوسيطة وتخرج النتيجة عبر الاصطلاح.
يوسّع إلى
jal ra, label
يستبدل المُجمِّع هذه التعليمة الزائفة بالتعليمة الحقيقية أو التعليمات المذكورة أعلاه.
مثال
call square # jumps to square; ra holds the return address
المصادر
- [1]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.5.1, Unconditional Jumps, page 30.
- [2]RISC-V International. The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture. Version 20260120. Section 2.4.1, Integer Register-Immediate Instructions, pages 28 to 29.
