| |||
| Home > ARM and Thumb Instructions > Branch and control instructions > B, BL, BX, BLX, and BXJ |
Branch, Branch with Link, Branch and exchange instruction set, Branch with Link and exchange instruction set, Branch and change to Jazelle state.
op1{cond}{.W}label
op2{cond}Rm
where:
op1is one of:
BBranch.
BLBranch with link.
BLXBranch with link, and exchange instruction set.
op2is one of:
BXBranch and exchange instruction set.
BLXBranch with link, and exchange instruction set.
BXJBranch, and change to Jazelle execution.
condis an optional condition code (see Conditional execution). is
not available on all forms of this instruction, see Instruction availability and branch
ranges.cond
.Wis
an optional instruction width specifier to force the use of a 32-bit B instruction
in Thumb-2. See B in Thumb-2 for
details.
labelis a program-relative expression. See Register-relative and program-relative expressions for more information.
Rmis a register containing an address to branch to.
All these instructions cause a branch to ,
or to the address contained in label.
In addition:Rm
The BL and BLX instructions
copy the address of the next instruction into lr (r14, the link
register).
The BX and BLX instructions
can change the processor state from ARM to Thumb, or from Thumb
to ARM.
BLX always
changes the state.label
BX and RmBLX derive
the target state from bit[0] of Rm:Rm
if bit[0] of is
0, the processor changes to, or remains in, ARM stateRm
if bit[0] of is
1, the processor changes to, or remains in, Thumb state.Rm
The BXJ instruction changes the processor
state to Jazelle.
Table 4.7 shows the instructions that are available in ARM and Thumb state. Instructions that are not shown in this table are not available. Notes in brackets show the first architecture version where the instruction is available.
Table 4.7. Branch instruction availability and range
| Instruction | ARM | 16-bit Thumb | 32-bit Thumb | |||
|---|---|---|---|---|---|---|
B label |
±32MB | (All) | ±2KB | (All T) | ±16MB[1] | (All T2) |
B{cond} label |
±32MB | (All) | 252 to +258 | (All T) | ±1MBa | (All T2) |
BL label |
±32MB | (All) | ±4MB [2] | (All T) | ±16MB | (All T2) |
BL{cond} label |
±32MB | (All) | - | - | - | |
BX Rm |
Available | (4T, 5) | Available | (All T) | Use 16-bit | (All T2) |
BX{cond} Rm |
Available | (4T, 5) | - | - | - | |
BLX label |
±32MB | (5) | ±4MB [2] | (5T) | ±16MB | (All T2 except ARMv7-M) |
BLX Rm |
Available | (5) | Available | (5T) | Use 16-bit | (All T2) |
BLX{cond} Rm |
Available | (5) | - | - | - | |
BXJ Rm |
Available | (5J, 6) | - | Available | (All T2 except ARMv7-M) | |
BXJ{cond} Rm |
Available | (5J, 6) | - | - | - | |
|
[1] Use [2] This is an instruction pair. | ||||||
Machine-level B and BL instructions
have restricted ranges from the address of the current instruction.
However, you can use these instructions even if is
out of range. Often you do not know where the linker places label.
When necessary, the linker adds code to enable longer branches.
See Chapter 3 Using the Basic
Linker Functionality in the Linker
User Guide. The added code is called a veneer.label
You can use the .W width specifier to force B to
generate a 32-bit instruction in Thumb-2 code.
B.W always generates a 32-bit instruction, even
if the target could be reached using a 16-bit instruction.
For forward references, B without .W always
generates a 16-bit instruction in Thumb code, even if that results
in failure for a target that could be reached using a 32-bit Thumb
instruction.
These instructions can be used as branches in Thumb-2EE code,
but cannot be used to change state. You cannot use the form
of these instructions in Thumb-2EE. In the register form, bit[0]
of op{cond} label must be 1, and
execution continues at the target address in ThumbEE state.Rm
See Instruction availability and branch ranges for details of availability of these instructions in each architecture.