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指令集代码
    @ ...

重要注意事项

  1. BX LR 是函数返回的标准方式
  2. B 指令用于相对跳转,范围受限
  3. BX 可以跳转到任意寄存器指定的地址
  4. 状态切换由硬件自动处理,对程序员透明

这两种跳转指令共同构成了ARM架构中流程控制的基础。