callزائف

call

زائف
تجميع RISC-V مرجع

يغطي 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