7. Інструкції переходу

Вони змушують виконання переходити до цільового місця, зазвичай вказаного міткою (дивіться директиву асемблера label()). Умовні переходи та інструкції it і ite перевіряють прапорці N (від’ємний), Z (нуль), C (перенесення) і V (переповнення) регістру стану програми (APSR), щоб визначити, чи слід виконати перехід.

Більшість відкритих інструкцій асемблера (включаючи операції переміщення) встановлюють прапорці, але є явні інструкції порівняння для перевірки значень.

Детальніша інформація про значення прапорців умов наведена в розділі інструкцій порівняння.

7.1. Конвенції документа

Позначення: Rm позначає регістри ARM R0-R15. LABEL позначає мітку, визначену директивою асемблера label(). <condition> вказує один з наступних специфікаторів умови:

  • eq Рівно (результат був нульовим)

  • ne Не рівно

  • cs Перенесення встановлено

  • cc Перенесення знято

  • mi Мінус (від’ємний)

  • pl Плюс (додатний)

  • 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) виконується для повернення з підпрограми. Для вкладених підпрограм регістр зв’язку зовнішніх областей видимості повинен бути збережений (зазвичай у стеку) перед виконанням внутрішніх викликів підпрограм.