news 2026/4/24 18:23:09

ARM 汇编指令:BX

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ARM 汇编指令:BX

ARM 汇编指令:BX

本文来自于我关于 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

核心定义

BXBranch and eXchange的缩写,意为分支并切换指令集。它是 ARM 指令集中用于实现子程序调用返回、以及在不同指令集状态(ARM 状态和 Thumb 状态)之间切换的关键指令。

基本语法

BX{<cond>} <Rm>
  • {}:可选的条件码,例如EQ,NE,GT等。用于条件执行。
  • :一个通用寄存器,其内容包含了目标地址目标指令集状态信息。

工作原理

BX 指令执行两个核心操作:

  1. 分支(跳转):将程序计数器 PC 设置为目标地址。
  2. 切换指令集:根据目标地址最低有效位(LSB)的值,决定切换到 ARM 状态还是 Thumb 状态。
关键:目标地址的最低有效位(LSB, Least Significant Bit)

在 ARM 体系结构中,指令必须是字对齐(ARM状态,4字节对齐)或半字对齐(Thumb状态,2字节对齐)。因此,地址的 LSB 在正常执行时总是 0。ARM 巧妙地利用了这个“闲置”的位来编码指令集状态:

  • 如果Rm的 LSB = 0:处理器在跳转到目标地址(Rm & 0xFFFFFFFE)后,切换到(或保持)ARM 状态。此时 PC 的 bit[0] 会被硬件忽略。
  • 如果Rm的 LSB = 1:处理器在跳转到目标地址(Rm & 0xFFFFFFFE)后,切换到(或保持)Thumb 状态

重要:BX 在执行跳转前,会自动清除 Rm 的 bit[0],以确保目标地址是正确对齐的。你提供的Rm值需要你自己确保 bit[0] 正确设置了状态。

主要用途

  1. 子程序返回(最常见)
    在 ARM 中,BL(Branch with Link) 指令用于调用子程序,它会将返回地址(PC+4PC+2)保存到链接寄存器LR(R14) 中。在子程序结束时,通常用BX LR返回。

    • 调用时,BL会自动将LR的 LSB 设置为当前指令集状态(CPSR 的 T 位),保证返回时能正确切换回原来的状态。
    ; 在主程序(ARM状态)中调用 BL thumb_function ; 调用Thumb子程序,LR的LSB被自动设为1 ... thumb_function: .thumb ; 声明为Thumb代码 ... ; 执行操作 BX LR ; 返回!LSB=1,所以切换回ARM状态
  2. 在 ARM 和 Thumb 状态间切换(常见于Cortex-A系列)
    当需要从一段 ARM 代码跳转到 Thumb 代码时,必须使用 BX 或类似的指令(如 BLX)来进行切换。

    ; 从 ARM 状态切换到 Thumb 状态 LDR R0, =thumb_code_label+1 ; +1 至关重要!确保目标地址LSB=1 BX R0 ; 跳转并切换到Thumb状态 .thumb thumb_code_label: ... ; 这里是Thumb指令
  3. 实现函数指针调用
    由于 BX 可以跳转到任意寄存器指定的地址,它非常适合用于调用通过函数指针指定的函数,这在C语言中很常见。

    // C 代码void(*func_ptr)(void)=some_function;func_ptr();// 编译器通常会生成 BX Rm 指令

与相关指令的对比

指令全称功能链接 (LR)状态切换
BXBranch and eXchange跳转到寄存器指定地址不保存返回地址根据目标地址 LSB 切换
BLXBranch with Link and eXchange跳转到寄存器/立即数地址保存返回地址到 LR根据目标地址 LSB 或固定切换
BBranch跳转到立即数地址不保存不切换,保持当前状态
BLBranch with Link跳转到立即数地址保存不切换,保持当前状态

示例

.syntax unified @ 统一汇编语法 .arch armv7-m @ 指定架构为Cortex-M(只支持Thumb) .thumb @ 以下为Thumb代码 .global _start _start: MOVS R0, #10 @ Thumb指令 ADDS R0, R0, #5 @ 假设我们需要调用一个已知地址的ARM函数(在Cortex-A上) LDR R1, =arm_function_addr @ 加载ARM函数地址 BX R1 @ 跳转并切换到ARM状态(假设R1的LSB=0) @ 返回后会切换回Thumb状态 ... .align 2 .arm @ 声明为ARM代码 arm_function_addr: MOV R2, #0x1000 @ ARM指令 ... BX LR @ 返回到调用者,并切换回Thumb状态(因为LR的LSB=1)

总结

BX是 ARM 体系结构中的一个智能跳转指令。它的核心价值在于将控制流转移(跳转)和指令集状态切换完美地结合在一起,通过目标地址的最低有效位(LSB)来编码状态信息。这使得 ARM/Thumb 混合编程、高效的子程序返回和动态函数调用成为可能,是 ARM 灵活性的一个重要体现。在编写需要状态切换的代码或进行子程序返回时,BX LR是最标准、最安全的方式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 1:56:09

低代码平台怎么选?这5款免费方案很友好

概述这两年不管是做业务系统、内部工具&#xff0c;还是想推进企业数字化&#xff0c;低代码平台真的帮了大忙。实际用下来会发现&#xff0c;选对平台&#xff0c;很多原本要排期开发的事情&#xff0c;用配置就能解决&#xff0c;而且成本压力也小很多。这里结合自己和身边朋…

作者头像 李华
网站建设 2026/4/19 0:04:53

HTML DOM 元素

HTML DOM 元素 HTML DOM(文档对象模型)是现代网页设计的基础。DOM 将 HTML 文档解析为一个树状结构,使得开发者能够通过编程方式操作网页内容、样式和行为。本文将深入探讨 HTML DOM 元素的概念、结构和用途。 概念 DOM(Document Object Model)是一种跨平台和语言独立的…

作者头像 李华
网站建设 2026/4/18 22:32:53

基于springboot+vue的微信小程序的公开课管理系统(源码+lw+部署文档+讲解等)

课题介绍随着在线教育的蓬勃发展&#xff0c;公开课因优质教育资源共享的特性备受青睐&#xff0c;但传统公开课管理模式存在课程信息分散、报名流程繁琐、学习进度难追踪、师生互动不便捷等痛点&#xff0c;影响教学效果与管理效率。本课题聚焦公开课教学管理场景&#xff0c;…

作者头像 李华
网站建设 2026/4/19 22:22:16

【配送路径规划】基于雪橇犬算法SDO求解带时间窗的骑手外卖配送路径规划问题(目标函数:最优路径成本 含服务客户数量 服务时间 载量 路径长度)附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真…

作者头像 李华
网站建设 2026/4/18 4:51:22

挑企业微信 SCRM 迷茫?从私域转化需求切入,微伴助手凭什么是第一选择

现在用企业微信的老板越来越多&#xff0c;但不少人觉得 “不好用”—— 加客户慢、发消息没效果、员工离职带跑客户&#xff0c;问题一堆。其实不是企业微信本身不行&#xff0c;而是缺了合适的 “企业微信工具” 来补位。这些工具就像 “外挂”&#xff0c;能把企业微信的基础…

作者头像 李华