Переход (B) и Переход со ссылкой (BL)
Эта команда будет выполнена, если условие истинно. Все различные условия перечислены в табл. 6. Машинные коды обеих команд приведены на рис.12.
Рис 12. Команда перехода
Команда перехода содержит знаковое 24-битное смещение, дополненное до 2-х. По-сути происходит умножение смещения на 4 и добавление к регистру PC с учетом знака. Таким образом, возможен переход в диапазоне +32 Мбайта.
Переходы за пределы +32 Мбайта должны использовать смещение или абсолютный адрес, который был предварительно загружен в регистр. В этом случае необходимо PC сохранить вручную в регистре R14 (если используется команда "переход со ссылкой").
Бит ссылки (link bit)
Переход со ссылкой (BL) сохраняет прежнее значение регистра PC в регистре ссылки (R14) текущего банка. Значение регистра PC, сохраненное в R14 (оно корректируется таким образом, чтобы осуществить предвыборку), и содержит адрес команды, следующей за командой перехода со ссылкой (BL). При этом CPSR не сохраняется вместе с PC, поэтому биты R14[1:0] всегда равны нулю.
Возврат из подпрограммы, вызываемой командой "переход со ссылкой", использует команду MOV PC,R14 (если содержимое R14 неискаженно) или команду LDM Rn!,{..PC} (R14 сохранен в стеке, указанном через регистр Rn).
Число машинных тактов выполнения
Обе команды перехода и перехода со ссылкой выполняется за 2S+1N машинных такта, где S и N зависят от типа тактов.
Синтаксис в ассемблере
Элемент {} может отсутствовать, но элемент <> - обязателен.
B{L}{cond} <выражение>
{L}: |
используется для указания того, что команда перехода будет осуществлена со ссылкой, в противном случае регистр R14 командой не используется. |
{cond}: |
двухсимвольная мнемоника условия (см. табл. 6). При отсутствии заменяется на AL (всегда). |
<выражение>: |
выражение для вычисления смещения перехода. |
Пример
here BAL here ; бесконечный цикл (машинный код: 0xEAFFFFFE)
B there ; Условие AL используется по-умолчению (тоже что и BAL)
CMP R1,#0 ; Если R1 равно нулю,
BEQ fred ; то перейти к freq,
BL sub+ROM ; иначе вызвать подпрограмму,
; заранее вычислив ее адрес (sub+ROM).
ADDS R1,#1 ; Прибавить к R1 единицу (воздействует на флаги CPSR)
BLCC sub ; Если флаг переноса C сброшен (R1 не переполнен),
; то вызвать подпрограмму по адресу со смещением (sub).
|
<---- Вернуться к Системе команд --->
|