ARM 汇编 B / BL 核心区别

1. 核心功能差异

B(Branch,单纯跳转)

  1. 只修改 PC,跳转到目标标号;
  2. 不保存返回地址到 LR (R14);
  3. 跳走后无法回到跳转指令下一条代码;
  4. 用途:死循环、分支跳转、永不返回的跳转(如中断复位、while (1))。

示例:

复制代码
B loop    ; 跳转到loop,一去不回
loop:
    ...

BL(Branch with Link,带链接跳转 = 函数调用)

  1. 跳转前自动执行:LR = 当前B/BL下一条指令地址;
  2. 再修改 PC 跳转到目标;
  3. 子程序末尾用 MOV PC, LR 即可返回调用处;
  4. 用途:调用子函数 / 子程序(C 语言函数调用底层就是 BL)。

示例完整调用:

复制代码
    BL delay_func  ; 保存返回地址到LR,跳去delay_func
    ; 执行完delay_func后回到这一行继续运行
    
delay_func:
    ; 延时逻辑
    MOV PC, LR     ; 返回BL下一条指令

2. 硬件编码区分(bit24 L 位)

  • B:指令 bit24 = 0,无链接;
  • BL:指令 bit24 = 1,开启链接、写入 LR。

3. 寻址范围(两者完全一样)

ARM32 相对偏移 24 位有符号数,左移 2 位,跳转范围 ±32MB; 只能跳当前 32MB 内标号,超出要用 LDR PC,=addr 长跳转。

4. 对比表

指令 是否存返回地址到 LR 能否返回 典型场景
B 否 不能 死循环、if‑else 分支、复位跳转
BL 是(自动保存) 能 子程序 / 函数调用
相关推荐
程序员JerrySUN1 小时前
Jetson Edge AI 实战05:Secure Boot 到底在保护什么?PKC、SBK、Fuse 与可信启动链一次讲清【视频讲解】
arm开发·人工智能·安全·计算机视觉·目标跟踪·音视频
水饺编程5 小时前
第2章:Linux 基础,mkdir 命令的简单入门
linux·c语言·汇编
老当益壮梁奶奶6 小时前
驱动学习(二):从零开始:驱动工程搭建与字符设备驱动框架详解(基于IMX6ULL)
c语言·arm开发·驱动开发·嵌入式硬件·学习
竣达技术7 小时前
机房运维:UPS 如何实现跨网段采集监控数据
运维·arm开发
女神下凡1 天前
嵌入式系统 vs 嵌入式文件系统
arm开发·嵌入式硬件·设计规范
女神下凡1 天前
芯参谋(55):LED 驱动 · 系统设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
Awh-1 天前
ARM 裸机开发 DAY10 学习笔记
arm开发·笔记·学习
水饺编程1 天前
第2章:Linux 基础,echo 命令
linux·c语言·汇编
番茄灭世神1 天前
PN学堂GD32教程第14篇——Arm单片机启动流程
arm开发·单片机·嵌入式硬件