ARM 汇编指令:B

ARM 汇编指令:B

本文来自于我关于 ARM 汇编指令系列文章。欢迎阅读、点评与交流~
1、汇编指令在不同架构中的联系与区别
2、ARM 汇编指令:MOV
3、ARM 汇编指令:LDR
4、ARM 汇编指令:STR
5、ARM 汇编指令:MRS 和 MSR
6、ARM 汇编指令:ORRS
7、ARM 汇编指令:BEQ
8、ARM 汇编指令:TST
9、ARM 汇编指令:B
10、ARM 汇编指令:BX

核心含义

BBranch 的缩写,意思是 无条件跳转。它会让程序的执行流程立即、无条件地跳转到指定的目标地址,继续执行。它是最基础、最常用的指令之一。

基本语法

assembly 复制代码
B   label
  • label: 一个符号(标签),代表程序中某个位置的地址。

工作原理

当执行到 B 指令时:

  1. 处理器计算出要跳转的目标地址(基于当前 PC 和标签的偏移量)。
  2. 将计算出的目标地址直接加载到程序计数器(PC) 中。
  3. 下一条被执行的指令就是目标地址处的指令。

这相当于 C 语言中的 goto 语句。

示例

assembly 复制代码
_start:
    MOV R0, #5      ; R0 = 5
    B   skip_add    ; 无条件跳转到 skip_add 标签处
    ADD R0, R0, #3  ; 这行指令会被跳过,不会执行

skip_add:
    MOV R1, #10     ; 跳转后从这里开始执行
    ADD R2, R0, R1  ; R2 = R0 + R1
    B   .           ; 跳转到自身,形成无限循环(常用于程序结尾)

主要用途

  1. 循环控制:跳转到循环开始处。

    assembly 复制代码
    loop_start:
        ... ; 循环体
        SUBS R1, R1, #1 ; 更新计数器并设置条件标志
        BNE loop_start   ; 如果 R1 != 0,则继续循环

    这里 BNE 是条件跳转,但循环的闭合需要 B 或其它分支指令。

  2. 跳过代码块:用于条件判断中,跳过某些不执行的代码。

    assembly 复制代码
        CMP R0, #0
        BEQ zero_case   ; 如果等于0,跳转
        ... ; 非零情况的处理
        B   end_if      ; 无条件跳过"zero_case"的代码
    zero_case:
        ... ; 等于0时的处理
    end_if:
  3. 函数/过程调用(简单版) :虽然更标准的调用用 BL(带链接的分支,用于函数调用),但在某些简单场景或尾调用优化中,也可能直接用 B

    assembly 复制代码
    ; 注意:使用 B 跳转到函数不会保存返回地址到 LR
    my_function:
        ...
        BX LR          ; 函数返回
    
    main:
        ...
        B my_function  ; 跳转到函数,但无法返回!通常这是错误的,应用 BL my_function
  4. 程序流程的永久转移:例如,在启动代码或状态机中,从一个模式永久跳转到另一个主循环。

与相关指令的对比

指令 全称 行为 用途
B Branch 无条件跳转 单纯的跳转,不打算返回
BL Branch with Link 跳转前,将返回地址(PC+4)保存到链接寄存器 LR(R14) 函数调用
BX Branch and eXchange 跳转,并可切换 ARM/Thumb 指令集 用于函数返回(BX LR)或跳转到状态未知的代码
Bcond (如 BEQ, BNE) Conditional Branch 根据条件标志(N,Z,C,V)决定是否跳转 条件执行、循环、if-else

技术细节(针对经典 ARM 模式,如 ARM7/ARM9)

  • B 指令的跳转范围是有限的 。它是一个 24 位有符号立即数 指定的偏移量(以字为单位),因此跳转范围约为 ±32MB(相对于当前 PC)。

  • 如果需要在更大范围内跳转,通常需要借助其他指令(如 LDR PC, =address)或通过寄存器间接跳转。

  • Thumb 指令集中,B 指令的编码和跳转范围有所不同(例如,Thumb 的 B 通常是 16 位指令,跳转范围更小)。

注意! 以上说法仅针对于经典ARM模式,如 ARM7/ARM9。在更新的架构如: Cortex-M 模式(Thumb-2 指令集)中,B指令的跳转范围相对更大。

总结

B label 就是告诉处理器:"别执行下一条指令了,马上去执行 label 那里的指令。"

它是控制程序流程最基础的构件,是所有条件分支和函数调用的基础。在阅读或编写汇编时,看到 B,你就知道程序的控制流将在这里发生一次直接的、无条件的转移。

相关推荐
txg66613 小时前
编译无关的漏洞检测:基于 Transformer 的 LLVM-IR 与汇编鲁棒建模
汇编·深度学习·安全·transformer
浩浩测试一下1 天前
汇编 16位32位64位通用寄存器(逆向分析)
汇编·windows·stm32·单片机·嵌入式硬件·逆向·二进制
浩浩测试一下2 天前
汇编常用的(JCC 串 判断)指令 通用寄存器 标志寄存器 段寄存器(逆向分析)
汇编·通用寄存器·逆向二进制·标志寄存器·段寄存器·串 jcc 常用指令
虹科汽车电子2 天前
高效传感器与ECU研发测试方案:虹科PSI5模拟器加速智能安全系统落地
arm开发·安全·seskion
浩浩测试一下3 天前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下3 天前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
szxinmai主板定制专家3 天前
RK3568 + CODESYS+实时系统运动控制器PLC,支持 AI 视觉目标检测,预测性维护,混合多系统部署,多路模拟量采集
arm开发·人工智能·嵌入式硬件·fpga开发
浩浩测试一下3 天前
汇编 内联汇编与混合编程 (逆向分析)
汇编·混合编程·windows编程·内联汇编·二进制逆向·c语言混合汇编
XMAIPC_Robot3 天前
深度无人机自动驾驶仪,中小型无人机硬件在环仿真飞行
运维·arm开发·人工智能·fpga开发·无人机·边缘计算
浩浩测试一下3 天前
汇编 结构体与宏
汇编··免杀·结构体·windows编程·逆向二进制