ARM汇编之跳转指令

ARM汇编语言之跳转指令

前言

ARM架构在当今主流的芯片中无论是MCU还是SOC都占有很大的市场,因此基于ARM架构的汇编语言对于嵌入式软件开发人员而言,其实也是一项必须掌握的基本功。

基础不牢,地动山摇”这句话无论放在哪个时代都永远不会过时,因此后续小T将抽空跟大家一起重新来学习下ARM汇编语言基础指令。

在我从事工作的过程中,当遇到很多C语言无法解释的时候,基于汇编语言的分析总是能够给到自己新的思路,屡试不爽,将会使你对计算机的理解更加深刻,同时解决问题的效率也会大大提升。

ARM汇编语言按照指令集分类可以分为如下六类:

  • 跳转指令;
  • 数据处理指令;
  • 程序状态寄存器(PSR)传输指令;
  • Load/Store 指令;
  • 协处理器指令;
  • 异常中断产生指令;

今天,我们先来一起学习下跳转指令,后续会按照这上述几大类给大家分别介绍。为了便于大家理解,以下是本文的主题大纲:

在这里插入图片描述


正文

在ARM架构中,存在如下两种方式来实现程序的跳转:

  • 直接的跳转指令;
  • 直接向PC赋值的长跳转指令;

其中,直接向PC中写入目标地址值,可以实现在4GB的地址空间中的任意跳转,这也是为什么被称为长跳转指令的原因。

除此以外,在ARM版本5及以上的体系中,已经支持ARM指令集与Thumb指令集的混合编程,通过指令使用的目标地址值的bit[0]来确定,当bit[0]值为1时,目标程序则为Thumb指令,当bit[0]为0时,目标程序为ARM指令。

ARM的跳转指令可以从当前指令向前或者向后32MB的地址空间跳转,下面将对这些指令进行一一介绍。

跳转指令

B指令(跳转指令)

B指令仅仅只用于跳转,相比BL指令,BL指令跳转的同时还会将PC寄存器的值保存至LR寄存器中。

如下图1所示介绍了B指令的格式要求以及相关示例。

在这里插入图片描述

图1 B指令的格式与示例

通过如下动图2可观察到寄存器PC以及R0的值的变化:

在这里插入图片描述

图2 B指令操作动图

BL指令(带返回的跳转指令)

如上图1所示,BL指令则是在B指令的基础上添加了L,那么执行该指令时就会将当前的PC的值保存至LR寄存器中。

在下图2中 所示,可以看到BL指令的使用例程:

在这里插入图片描述

图3 BL指令格式与示例

下图4所示为BL指令的应该过程中PC与LR寄存器之间的变化:运行BL指令时会将此时的PC中的值赋值给到LR寄存器。

在这里插入图片描述

图4 BL指令操作动图

BLX指令(带返回和状态切换的跳转指令)

如下图5所示为BLX指令的指令格式以及使用示例:
在这里插入图片描述

图5 BLX指令说明与示例

除此以外,BLX还存在如下图6所示的另一种指令格式,使用该指令则可以跳转至指定的目标地址,该目标地址的指令可以时ARM指令,也可以时Thumb指令。

在这里插入图片描述

图6 BLX指令2说明与示例

BX指令(带状态切换的跳转指令)

如下图7所示为BX指令的指令格式:

在这里插入图片描述

图7 BX指令说明与示例

该目标地址处的指令即可以是ARM指令,也可以是Thumb指令,目标地址值为指令的值与0xFFFFFFFE做与操作的结果,目标地址处的指令类型由Rm的bit[0]决定。

长跳转指令

直接通过向PC寄存器写入目标地址值便可以实现在4GB的地址空间范围内的任意长跳转。同时如果在执行长跳转指令之前使用“MOV LR,PC” 便可以实现在4GB空间范围内的子程序调用;

PC直接赋值

在这里插入图片描述
更多精彩内容,看公号"ADAS与ECU之吾见"!

猜你喜欢

转载自blog.csdn.net/wto9109/article/details/127354689
今日推荐