7. تعليمات التفرّع¶
تتسبب هذه في قفز التنفيذ إلى موقع هدف يُحدَّد عادةً بتسمية (انظر توجيه المُجمّع label()). تختبر التفرّعات الشرطية والتعليمتان it و ite أعلام سجل حالة برنامج التطبيق (APSR): N (سالب) و Z (صفر) و C (حمل) و V (تجاوز) لتحديد ما إذا كان ينبغي تنفيذ التفرّع.
تضبط معظم تعليمات المُجمّع المكشوفة (بما في ذلك عمليات النقل) الأعلام ولكن توجد تعليمات مقارنة صريحة لتمكين اختبار القيم.
تتوفر مزيد من التفاصيل حول معنى أعلام الحالة في قسم تعليمات المقارنة.
7.1. اصطلاحات المستند¶
الترميز: تشير Rm إلى سجلات ARM المسماة R0-R15. وتشير LABEL إلى تسمية معرّفة بتوجيه المُجمّع label(). وتشير <condition> إلى أحد محدِّدات الشرط التالية:
eq يساوي (كانت النتيجة صفرًا)
ne لا يساوي
cs الحمل مضبوط
cc الحمل غير مضبوط
mi سالب (negative)
pl موجب (positive)
vs التجاوز مضبوط
vc التجاوز غير مضبوط
hi > (مقارنة بدون إشارة)
ls <= (مقارنة بدون إشارة)
ge >= (مقارنة بإشارة)
lt < (مقارنة بإشارة)
gt > (مقارنة بإشارة)
le <= (مقارنة بإشارة)
7.2. التفرّع إلى تسمية¶
b(LABEL) تفرّع غير مشروط
beq(LABEL) تفرّع إذا كان مساويًا
bne(LABEL) تفرّع إذا كان غير مساوٍ
bge(LABEL) تفرّع إذا كان أكبر من أو يساوي
bgt(LABEL) تفرّع إذا كان أكبر من
blt(LABEL) تفرّع إذا كان أقل من (<) (بإشارة)
ble(LABEL) تفرّع إذا كان أقل من أو يساوي (<=) (بإشارة)
bcs(LABEL) تفرّع إذا كان علم الحمل مضبوطًا
bcc(LABEL) تفرّع إذا كان علم الحمل غير مضبوط
bmi(LABEL) تفرّع إذا كان سالبًا
bpl(LABEL) تفرّع إذا كان موجبًا
bvs(LABEL) تفرّع إذا كان علم التجاوز مضبوطًا
bvc(LABEL) تفرّع إذا كان علم التجاوز غير مضبوط
bhi(LABEL) تفرّع إذا كان أعلى (بدون إشارة)
bls(LABEL) تفرّع إذا كان أقل أو يساوي (بدون إشارة)
7.3. التفرّعات الطويلة¶
تستخدم الشفرة الناتجة عن تعليمات التفرّع المذكورة أعلاه عرض بت ثابتًا لتحديد وجهة التفرّع، التي تكون نسبيةً إلى PC. وبالتالي في البرامج الطويلة حيث تكون تعليمة التفرّع بعيدة عن وجهتها سيُنتج المُجمّع خطأ "branch not in range". ويمكن التغلب على هذا بالمتغيرات "العريضة" مثل
beq_w(LABEL) تفرّع طويل إذا كان مساويًا
تستخدم التفرّعات العريضة 4 بايت لترميز التعليمة (مقارنةً بـ 2 بايت لتعليمات التفرّع القياسية).
7.4. الروتينات الفرعية (الدوال)¶
عند الدخول إلى روتين فرعي يخزّن المعالج عنوان العودة في السجل r14، المعروف أيضًا باسم سجل الرابط (lr). وتُنفّذ العودة إلى التعليمة التي تلي استدعاء الروتين الفرعي بتحديث عداد البرنامج (r15 أو pc) من سجل الرابط. وتعالج التعليمات التالية هذه العملية.
bl(LABEL)
ينقل التنفيذ إلى التعليمة التي تلي LABEL مع تخزين عنوان العودة في سجل الرابط (r14).
bx(Rm) تفرّع إلى العنوان المحدد بواسطة Rm.
تُصدَر bx(lr) عادةً للعودة من روتين فرعي. بالنسبة للروتينات الفرعية المتداخلة يجب حفظ سجل الرابط للنطاقات الخارجية (عادةً على المكدس) قبل إجراء استدعاءات الروتينات الفرعية الداخلية.