7. פקודות הסתעפות¶
אלה גורמות לביצוע לקפוץ למיקום יעד המצוין בדרך כלל על ידי תווית (ראו את הנחיית האסמבלר label()). הסתעפויות מותנות והפקודות it ו-ite בודקות את הדגלים N (negative), Z (zero), C (carry) ו-V (overflow) ב-Application Program Status Register (APSR) כדי לקבוע אם יש לבצע את ההסתעפות.
רוב פקודות האסמבלר החשופות (כולל פעולות העברה) מגדירות את הדגלים, אך קיימות פקודות השוואה מפורשות המאפשרות לבדוק ערכים.
פרטים נוספים על משמעות דגלי התנאי מסופקים בסעיף comparison instructions.
7.1. מוסכמות המסמך¶
סימון: Rm מציין את אוגרי ARM R0-R15. LABEL מציין תווית המוגדרת בעזרת הנחיית האסמבלר label(). <condition> מציין אחד ממצייני התנאי הבאים:
eq שווה ל- (התוצאה הייתה אפס)
ne לא שווה
cs דגל הנשא מוגדר (carry set)
cc דגל הנשא נקי (carry clear)
mi מינוס (שלילי)
pl פלוס (חיובי)
vs דגל הגלישה מוגדר (overflow set)
vc דגל הגלישה נקי (overflow clear)
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, הידוע גם כ-link register (lr). החזרה לפקודה שאחרי קריאת השגרה מתבצעת על ידי עדכון ה-program counter (r15 או pc) מה-link register. תהליך זה מטופל על ידי הפקודות הבאות.
bl(LABEL)
מעביר את הביצוע לפקודה שאחרי LABEL ושומר את כתובת החזרה ב-link register (r14).
bx(Rm) הסתעף לכתובת המצוינת על ידי Rm.
בדרך כלל bx(lr) משמש לחזרה משגרה. עבור שגרות מקוננות יש לשמור את ה-link register של ההיקפים החיצוניים (בדרך כלל על המחסנית) לפני ביצוע קריאות לשגרות פנימיות.