6. تعليمات المقارنة

تؤدي هذه تعليمة حسابية أو منطقية على وسيطين، فتتجاهل النتيجة لكنها تضبط أعلام الشرط. عادةً ما تُستخدم لاختبار قيم البيانات دون تغييرها قبل تنفيذ تفرع شرطي.

6.1. اصطلاحات التوثيق

الترميز: Rd, Rm, Rn تدل على سجلات ARM من R0 إلى R7. imm8 تدل على قيمة فورية بعرض 8 بت.

6.2. سجل حالة برنامج التطبيق (APSR)

يحتوي هذا على أربع بتات تختبرها تعليمات التفرع الشرطي. عادةً ما يختبر التفرع الشرطي عدة بتات، على سبيل المثال bge(LABEL). يمكن أن يعتمد معنى رموز الشرط على ما إذا كانت معاملات تعليمة حسابية تُعامَل كأعداد صحيحة ذات إشارة أو بلا إشارة. وبذلك يفترض bhi(LABEL) أن أعدادًا بلا إشارة قد عُولجت بينما يفترض bgt(LABEL) معاملات ذات إشارة.

6.3. بتات APSR

  • Z (صفر)

يُضبط هذا إذا كانت نتيجة عملية ما صفرًا أو إذا كان معاملا مقارنة متساويين.

  • N (سالب)

يُضبط إذا كانت النتيجة سالبة.

  • C (حمل)

تضبط عملية جمع علم الحمل عندما يفيض الناتج خارج البت الأكثر أهمية (MSB)، على سبيل المثال جمع 0x80000000 و0x80000000. وبحكم طبيعة حساب المتمم الثنائي، ينعكس هذا السلوك في الطرح، حيث يُشار إلى الاقتراض بأن بت الحمل يكون صفرًا. وبذلك يُنفَّذ 0x10 - 0x01 على أنه 0x10 + 0xffffffff الذي سيضبط بت الحمل.

  • V (فائض)

يُضبط علم الفائض إذا كانت النتيجة، عند النظر إليها كعدد بالمتمم الثنائي، تحمل الإشارة "الخاطئة" بالنسبة إلى المعاملات. على سبيل المثال، سيؤدي جمع 1 إلى 0x7fffffff إلى ضبط بت الفائض لأن النتيجة (0x80000000)، عند النظر إليها كعدد صحيح بالمتمم الثنائي، سالبة. لاحظ أنه في هذه الحالة لا يُضبط بت الحمل.

6.4. تعليمات المقارنة

تضبط هذه أعلام N (سالب) وZ (صفر) وC (حمل) وV (فائض) في سجل APSR (سجل حالة برنامج التطبيق).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. التنفيذ الشرطي

توفر تعليمتا it وite وسيلة للتنفيذ الشرطي لما بين تعليمة واحدة وأربع تعليمات لاحقة دون الحاجة إلى تسمية.

  • it(<condition>) إذا عندئذ

نفّذ التعليمة التالية إذا كان <condition> صحيحًا:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) إذا عندئذ وإلا

إذا كان <condition> صحيحًا، نفّذ التعليمة التالية، وإلا نفّذ التي تليها. وبذلك:

cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here

يمكن توسيع هذا للتحكم في تنفيذ ما يصل إلى أربع تعليمات لاحقة: it[x[y[z]]] حيث x,y,z=t/e؛ مثل itt، itee، itete، ittte، itttt، iteee، إلخ.