B (Branch)
- 用于无条件跳转到目标地址。
- 不会保存返回地址。
- 只能跳转到当前指令集(ARM 或 Thumb)。
- 主要用于执行流程的分支和跳转。
例如
B target_address @ 无条件跳转到 target_address
BL (Branch with Link):
- 用于调用子程序,并将返回地址(当前指令的下一条指令地址)保存到链接寄存器(LR,R14)。
- 只能跳转到当前指令集(ARM 或 Thumb)。
- 主要用于子程序调用,以便可以从子程序返回。
例如
BL target_function @ 调用子程序 target_function,并将返回地址保存到 LR
BX (Branch and Exchange):
- 用于跳转到寄存器中的地址,并可能切换指令集。
- 跳转的同时,根据目标地址的最低位选择指令集:0 表示 ARM 指令集,1 表示 Thumb 指令集。
- 主要用于返回或切换指令集。
例如
BX Rm @ 跳转到寄存器 Rm 指定的地址,并可能切换指令集
BLX (Branch with Link and Exchange):
- 用于调用子程序,并将返回地址保存到链接寄存器(LR,R14),并可能切换指令集。
- 有两种形式:跳转到寄存器中的地址或立即数地址。
- 根据目标地址或寄存器值的最低位选择指令集:0 表示 ARM 指令集,1 表示 Thumb 指令集
例如
BLX Rm @ 调用寄存器 Rm 指定的子程序,并可能切换指令集
BLX target_address @ 调用 target_address 指定的子程序,并可能切换指令集
总结
- B:直接跳转,不保存返回地址,不切换指令集。
- BL:调用子程序,保存返回地址到 LR,不切换指令集。
- BX:跳转到寄存器地址,可能切换指令集。
- BLX:调用子程序,保存返回地址到 LR,可能切换指令集
注:
R14:连接寄存器(LR)
R15:程序计数器(PC)