retزائف

ret

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

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

الوصف

يعود ret من دالة ويعيد التحكم إلى المستدعي. يتوقع call ذلك. عند استدعاء دالة، يضع المستدعي عنوان العودة في السجل ra (انظر call وjal)، ويقفز ret إلى ذلك العنوان، الذي يتابع مباشرة بعد الاستدعاء الأصلي. إنها تعليمة زائفة تقفز إلى ra.

يعمل ret فقط عندما يظل ra يحمل العنوان الصحيح. في دالة لا تستدعي أي شيء آخر، لا شيء يغيّر ra بين الدخول والخروج. إن call داخل الدالة يكتب فوق ra بعنوان عودة جديد ويمحو العنوان الذي تحتاجه الدالة. الدالة التي تستدعي دوال أخرى تحفظ ra عند الدخول وتستعيده قبل ret. بدون الاستعادة، تعود الدالة إلى المكان الخطأ، ويقفز البرنامج إلى كود غير ذي صلة أو يتكرر إلى الأبد.

بحسب العرف، تضع الدالة نتيجتها في السجل a0 قبل العودة، ويقرأها المستدعي هناك.

يقول دليل RISC-V إن عودة الإجراء في اصطلاح الاستدعاء القياسي تُرمَّز كـ jalr مع rd=x0 وrs1=x1 وقيمة فورية 0. يقفز إلى العنوان في x1 ولا يكتب عنوان رابط، لأن x0 يتجاهله. ويضيف الدليل أن المعالجات تستخدم أرقام السجلات في jal وjalr كتلميحات للتنبؤ بعوائد الدوال، وهذا أحد أسباب إبقاء الاصطلاح القياسي عنوان العودة في x1.

المثال هو أبسط دالة كاملة. يضرب square وسيطه في نفسه ويعيد ret النتيجة. لا يستدعي أي شيء آخر، لذا لا يحفظ ولا يستعيد شيئًا. تشغيله في المحاكي يُظهر عودة التحكم إلى المستدعي.

يوسّع إلى

jalr zero, ra, 0

يستبدل المُجمِّع هذه التعليمة الزائفة بالتعليمة الحقيقية أو التعليمات المذكورة أعلاه.

مثال

square:
  mul a0, a0, a0
  ret              # return to the caller