ФЭНДОМ


B,BL (ARM)

Формат инструкций B и BL

Бит 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 непредсказуем.