B And BX
目录
B 指令
基本概念
B指令用于无条件跳转到指定的标签或地址。
语法格式
B 目标地址/标签
示例
B loop_start @ 无条件跳转到loop_start标签
B 0x08001000 @ 无条件跳转到地址0x08001000
特点
- 不保存返回地址
- 用于循环、条件分支等
- 跳转范围有限制(相对偏移)
BX 指令(带状态切换的跳转)
基本概念
BX指令用于跳转到寄存器指定的地址,并可切换ARM/Thumb状态。
语法格式
BX 目标寄存器
示例
BX LR @ 跳转到LR寄存器地址,用于函数返回
BX R0 @ 跳转到R0寄存器指定的地址
特点
- 根据目标地址最低位自动切换状态,不同状态性能开销不一样
- 最低位=0:切换到ARM(32位指令)状态
- 最低位=1:切换到Thumb(16位指令)状态
- 常用于函数返回
关键区别
| 特性 | B 指令 | BX 指令 |
|---|---|---|
| 操作数 | 立即数/标签 | 寄存器 |
| 状态切换 | 无 | 根据地址最低位自动切换 |
| 主要用途 | 循环、条件跳转 | 函数返回、动态跳转 |
| 返回地址 | 不保存 | 通常与BL配合使用 |
实际应用场景
B 指令 - 循环和条件判断
loop:
@ 循环体代码
SUBS R0, R0, #1 @ 计数器减1并设置标志
BNE loop @ 如果不为0则继续循环
BX 指令 - 函数返回
my_function:
PUSH {R4, LR} @ 保存寄存器
@ 函数体代码...
POP {R4, LR} @ 恢复寄存器
BX LR @ 返回到调用者
BL + BX 组合 - 完整的函数调用
main:
BL my_function @ 调用函数,LR自动保存返回地址
@ ... 继续执行 ...
my_function:
@ 函数体...
BX LR @ 返回到main函数的调用点
状态切换机制
Thumb状态识别
@ 假设要跳转到Thumb代码(地址最低位=1)
LDR R0, =thumb_code+1 @ 地址加1表示Thumb状态
BX R0 @ 跳转并切换到Thumb状态
thumb_code:
.thumb @ Thumb指令集代码
@ ...
重要注意事项
- BX LR 是函数返回的标准方式
- B 指令用于相对跳转,范围受限
- BX 可以跳转到任意寄存器指定的地址
- 状态切换由硬件自动处理,对程序员透明
这两种跳转指令共同构成了ARM架构中流程控制的基础。