Бит L равен нулю для инструкции B и единице для инструкции BL.
Инструкции B и BL выполняют переход на указанный адрес. BL, кроме того, сохраняет адрес возврата (адрес команды, следующей за BL) в регистре LR (R14).
Синтаксис[]
B(L){cond} target_address
cond определяет, при каком условии команда будет выполнена.
target_address определяет адрес инструкции, на которую выполняется переход. Адрес перехода вычиляется следующим образом:
1. Находящееся в коде команды значение signed_immed_24 расширяется до 30 разрядов.
2. Полученная величина сдвигается влево на 2 бита, в результате чего получается 32-разрядное число со знаком, два младших бита которого равны нулю.
3. Итоговое 32-разрядное число прибавляется к текущему значению счётчика команд PC, что обеспечивает выполнение перехода (текущее значение PC равно адресу данной команды B или BL плюс 8).
Версии архитектуры[]
Все.
Исключения[]
Отсутствуют.
Операция[]
if условие выполнено then if L = 1 then LR = адрес инструкции, следующей за BL PC = PC + (SignExtend_30(signed_immed_24) << 2)
Использование[]
Команды B и BL используются для организации перехода по фиксированному адресу, находящемуся в пределах от –33554432 до +33554428 байтов от команды перехода. Команда BL, кроме того, запоминает адрес возврата в регистре LR (R14); поэтому она используется для вызова подпрограмм. Для возврата из подпрограммы обычно применяется один из трёх методов:
- команда BX LR в тех версиях архитектуры, где она имеется (таковыми являются все версии, начиная с ARMv4T, т.е. все сколько-нибудь актуальные);
- команда MOV PC, LR;
- пара команд, первая из которых обеспечивает сохранение в стеке содержимого регистров, в том числе и LR, а вторая восстанавливает регистры из стека, заодно возвращая управление вызывающей программе благодаря сохранению значения LR не в этот регистр, а в счётчик команд, например:
STMFD SP!, {регистры, LR} ... LDMFD SP!, {регистры, PC}
Примечания[]
Если прибавление значения смещения, заданного в коде команды, к содержимому PC вызывает пересечение нулевого адреса в ту или другую сторону, результат выполнения инструкции B или BL непредсказуем.