jal
يغطي lyszt.net jal وتعليمات RISC-V الأخرى بمزيد من التفصيل.
تنسيق الترميز
الوصف
jal تستدعي دالة. الدالة هي كتلة مسماة من التعليمات يمكن تشغيلها من عدة أماكن ثم العودة، بحيث تُكتب المنطقية مرة واحدة وتُستخدم في أي مكان. استدعاء دالة يحتاج إلى شيئين. يقفز البرنامج إلى حيث توجد الدالة، ويتذكر من أين جاء ليعود بعد ذلك. jal تفعل كليهما، واسمها jump and link.
تذهب القفزة إلى تسمية تحدد الدالة. يحدث جزء الربط قبل القفزة. تحفظ jal عنوان التعليمة التالية، التي تأتي مباشرة بعد الاستدعاء، في سجل. تستخدم الدالة ذلك العنوان المحفوظ للعودة.
بحسب العرف، يذهب العنوان المحفوظ إلى سجل يُسمى ra، اختصارًا لعنوان العودة. السطر أدناه يقفز إلى دالة square ويترك في ra العنوان الذي يجب العودة إليه.
jal ra, square
عندما تنتهي الدالة، تعود بالقفز إلى العنوان الموجود في ra، وهذا ما تفعله التعليمة ret. الاختصار المعتاد لنفس الاستدعاء موضح أدناه.
call square
يقول دليل RISC-V إن إزاحة القفز تُحسب بمضاعفات 2 بايت، وتُوسَّع بالإشارة وتُضاف إلى عنوان تعليمة القفز. وهذا يعطي نطاقًا قدره زائد أو ناقص 1 MiB، حيث 1 MiB يساوي 1,048,576 بايت. تحفظ jal عنوان التعليمة التالية، وهو pc زائد 4، في rd. يستخدم اصطلاح استدعاء البرمجيات القياسي x1 كسجل عنوان العودة و x5 كسجل ربط بديل. تستخدم تعليمات القفز غير المشروط عنونة نسبية إلى pc، مما يدعم الشفرة المستقلة عن الموضع، أي الشفرة التي تعمل أينما حُمِّلت في الذاكرة.
تستبدل jal قيمة ra بعنوان عودة جديد. إذا استدعت دالة دالة أخرى، فإن الاستدعاء الداخلي يستبدل العنوان المحفوظ للاستدعاء الخارجي. الدالة التي تقوم باستدعاءات خاصة بها يجب أن تحفظ ra أولًا وتستعيده قبل العودة. يستدعي المثال square ويترك عنوان العودة في ra.
مثال
jal ra, square # call square; ra holds the return address
