jalr

jalr

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

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

تنسيق الترميز

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

الوصف

ينتمي jalr إلى نفس عائلة jal، حيث يرمز الحرف r إلى السجل. تقوم كلتا التعليمتين بالقفز وتخزين عنوان العودة، كما هو موضح في صفحة jal. الفرق هو هدف القفز. يقفز jal إلى تسمية ثابتة عند كتابة البرنامج، بينما يقفز jalr إلى عنوان محفوظ في سجل، مما يسمح بحساب الوجهة في وقت التشغيل.

هذا ما يسمح للدالة بالعودة. يضع المستدعي عنوان العودة في السجل ra، وتعود الدالة باستخدام jalr للوصول إلى العنوان في ra. تعليمة ret هي jalr إلى ra.

تنطبق القدرة نفسها كلما كانت الوجهة غير معروفة مسبقًا. وهي تشمل الاستدعاءات إلى دالة تم تمرير عنوانها، والاختيار بين إجراءات مدرجة في جدول عناوين، وهكذا يوزّع بيان switch كبير أو مفسّر.

وفقًا لدليل RISC-V، يضيف jalr القيمة الفورية ذات 12 بت الموسّعة بالإشارة إلى السجل rs1، ثم يمسح البت الأقل أهمية من النتيجة. يخزّن عنوان التعليمة التالية، pc زائد 4، في rd، ويمكن استخدام x0 كوجهة عندما لا تكون هناك حاجة إلى عنوان عودة. يصل lui متبوعًا بـ jalr إلى أي عنوان مطلق 32 بت، ويصل auipc متبوعًا بـ jalr إلى أي عنوان نسبي إلى pc من 32 بت. ترفع تعليمتا القفز استثناءً إذا لم يكن العنوان الهدف محاذيًا لحد أربع بايتات.

يظهر تنسيق jalr أدناه. يقفز إلى العنوان في السجل rs مضافًا إليه إزاحة صغيرة اختيارية، ويخزّن عنوان العودة في rd.

jalr rd, rs, offset

كما هو الحال مع jal، يُستبدل السجل الذي يكتبه، لذا ينطبق الحرص نفسه على الحفاظ على ra.

مثال

la t0, target
jalr ra, t0, 0   # jump to target; ra holds the return address