ARM汇编指令—跳转(分支)指令(b &bl & bx)

一、跳转的两种实现方式

跳转指令用于实现程序流程的跳转,在 ARM 程序中有两种方法可以实现程序流程的跳转:

(1) 使用专门的跳转指令。(b & bl & bx等)
(2) 直接向程序计数器 PC 写入跳转地址值。
    通过向程序计数器 PC 写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用MOV LR , PC等类似指令,可以保存将来的返回地址值,从而实现在 4GB 连续的线性地址空间的子程序调用。

二、专用的跳转指令

ARM 指令集中的跳转指令可以完成从当前指令向前或向后的 32MB 的地址空间的跳转,包括以下 4 条指令:

(1) B 跳转指令

指令的语法格式:B    Label(只能是标号)

B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。该指令直接跳转,就没打算返回。

注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)。

例1:

B Label ;程序无条件跳转到标号 Label 处执行

例2:

BEQ Label;上一步的计算结果使得Z = 0的时候跳转到LABEL处执行

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

指令的语法格式: BL   Label(只能是标号)

BL 是另一个跳转指令,但跳转之前,会在寄存器R14(LR寄存器) 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段

例1:
BL Label ;当程序无条件跳转到标号 Label 处执行时,同时将当前的 PC 值保存到 R14 中

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

------------------------------------------

note:

arm有两种工作状态:

32位,该状态执行字对准的arm指令;

16位,该状态执行半字对准的Thumb指令

------------------------------------------------

指令的语法格式:BX     <Rm>(只能是寄存器)

带状态切换的跳转指令BX使程序跳转到指令中指定的参数Rm指定的地址执行程序。

若 Rm 的 bit[0] 为1,切换到 Thumb 指令执行;

若 Rm 的 bit[0] 为0,切换到 ARM 指令执行。

例:BX   R0      ;跳转到R0寄存器中存储的地址,如果R0[0]=1,则进入Thumb状态。

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

指令的语法格式:BLX   <Rm>

                             BLX    Label

BLX label 无论何种情况,始终会更改处理器的状态。
BLX Rm 可从 Rm 的位 [0] 推算出目标状态:
如果 Rm 的位 [0] 为 0,则处理器的状态会更改为(或保持在)ARM 状态
如果 Rm 的位 [0] 为 1,则处理器的状态会更改为(或保持在)Thumb 状态。




http://luleimi.blog.163.com/blog/static/175219645201210922139272/

http://blog.sina.com.cn/s/blog_861912cd0100vqm7.html

猜你喜欢

转载自blog.csdn.net/wwwlyj123321/article/details/80793533
今日推荐