ARM汇编编程(AArch64架构)课程 - 第8章:控制流与循环

目录

    • [1. 分支指令](#1. 分支指令)
      • [1.1 无条件分支(B/BL)](#1.1 无条件分支(B/BL))
      • [1.2 条件分支(CBNZ/CBZ)](#1.2 条件分支(CBNZ/CBZ))
    • [2. 循环优化](#2. 循环优化)
      • [2.1 循环展开(LOOP Unrolling)](#2.1 循环展开(LOOP Unrolling))
      • [2.2 优化策略](#2.2 优化策略)

1. 分支指令

1.1 无条件分支(B/BL)

assembly 复制代码
B   label      ; 跳转到label处(不保存返回地址)
BL  label      ; 跳转并保存返回地址到LR寄存器(用于函数调用)
  • 特点 :
    • B指令不保存返回地址,适用于简单跳转
    • BL自动保存PC+4到LR(x30),用于子程序调用
    • 跳转范围:±128MB(26位偏移)

1.2 条件分支(CBNZ/CBZ)

assembly 复制代码
CBZ  Wn, label  ; 当Wn==0时跳转
CBNZ Xn, label  ; 当Xn!=0时跳转
  • 应用场景 :
    • 循环条件检查
    • 空指针检测
    • 快速路径优化
  • 注意 :
    • 仅支持32/64位寄存器(Wn/Xn)
    • 跳转范围:±1MB(19位偏移)

2. 循环优化

2.1 循环展开(LOOP Unrolling)

原始循环:

assembly 复制代码
mov x0, #100           ; 循环100次
loop:
  subs x0, x0, #1      ; x0--
  b.ne loop            ; 若x0!=0则继续

展开4次后的循环:

assembly 复制代码
mov x0, #25            ; 100/4=25次
loop:
  subs x0, x0, #1      ; x0--
  b.ne loop            ; 实际执行4条指令/迭代

2.2 优化策略

技术 优点 缺点
部分展开 减少分支预测失败 代码量适度增加
完全展开 消除所有分支开销 显著增加代码尺寸
软件流水 隐藏指令延迟 增加寄存器压力

最佳实践:

  1. 优先展开小循环(迭代次数<100)
  2. 平衡展开因子(通常4-8次)
  3. 使用PRFM预取指令减少内存延迟
  4. 结合条件执行(如CSEL)处理剩余迭代
相关推荐
工控存储研习6 小时前
eMMC分区方案设计:Boot分区、系统分区、数据分区怎么分才合理
arm开发
女神下凡7 小时前
芯参谋(68):ADC模数转换器电路设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
水饺编程11 小时前
第2章:Linux 基础,在 root 中创建用户账号
linux·c语言·汇编·1024程序员节
一个风轻云淡14 小时前
从 int $0x80 到 iret:用 gdb 把 getpid 走一遍
linux·c语言·开发语言·汇编
chu_bingzhi17 小时前
ARM异常处理
arm开发
武汉万象奥科18 小时前
T153芯片解析:ARM+RISC-V异构架构,集成三路千兆网
arm开发·嵌入式硬件·物联网·arm核心板
黑马水牛1 天前
RK3588系列:01-系统烧录与开发环境搭建
arm开发·嵌入式硬件
水饺编程1 天前
第2章:Linux 基础,切换到超级用户
linux·c语言·汇编
像枫一样2 天前
STM32串口轮询收发实战教程
arm开发·c++·stm32·单片机·嵌入式硬件·fpga开发·51单片机
晚枫歌F2 天前
dpdk实现kni
arm开发