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