7. Инструкции ветвления¶
Они заставляют выполнение перейти к целевому местоположению, обычно задаваемому меткой (см. ассемблерную директиву label()). Условные ветвления и инструкции it и ite проверяют флаги N (отрицательный), Z (ноль), C (перенос) и V (переполнение) регистра состояния прикладной программы (Application Program Status Register, 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) используется для возврата из подпрограммы. Для вложенных подпрограмм регистр связи внешних областей видимости должен быть сохранён (обычно в стеке) перед выполнением вызовов внутренних подпрограмм.