跳转指令介绍
1、跳转指令简介
在C程序中,函数A调用函数B的实质是什么?实质是:跳转去执行函数B的代码,函数B执行完后,还要返回到函数A继续执行后面的代码。对应的汇编指令就是跳转指令。
void   A()
{int a = 10;B(a);printf(“ok”);
}
2、指令语法及使用
2.1、指令简介
核心指令是B、BL,变种指令有BX和BLX。
- B:Branch,跳转
- BL:Branch with Link,跳转前先把返回地址保持在LR寄存器中
- BX:Branch and eXchange,根据跳转地址的BIT0切换为ARM或Thumb状态(0:ARM状态,1:Thumb状态)
- BLX:Branch with Link and eXchange,根据跳转地址的BIT0切换为ARM或Thumb状态(0:ARM状态,1:Thumb状态)
2.2、B指令
B(分支)指令将程序执行转移到由标签指定的地址。
(1)语法
B{cond}{.W} label-  cond是指令执行的条件代码,例如BNE,是不相等的条件,需要状态寄存器的Z等于0。Z等于0表示不相等,才执行跳转。 
2.3、BL指令
(1)语法
BL{cond} label2.4、BX指令
BX(分支与交换)指令将程序执行转移到寄存器中指定的地址。BX 可以将核心状态从 ARM 更改为 Thumb,或者从 Thumb 更改为 ARM。BX Rm 将根据 Rm 的第 0 位设置状态:
- Rm bit[0] = 0 ARM state.
- Rm bit[0] = 1 Thumb state.
(1)语法
BX{cond} Rm2.5、BLX指令
(1)语法
BLX{cond} label
BLX{cond} Rm3、示例代码
(1)示例1
    B		Delay   ;跳转到Delay标签执行程序;标签Delay
DelayMOV		R0, #1000    ;R0 = 5LoopSUBS    R0, R0, #1  ; R0 = R0-1,S表示需要更新状态标志;R0减到等于0时,零标志Z置1BNE		Loop        ;B表示跳转指令,NE是条件代码(Z=0)MOV		R1, #1      ;循环结束,R1 = 1
(2)示例2
		BL		Delay     ; 跳转前把返回地址保持在LR寄存器里MOV		R1, #1
DelayMOV		R0, #5
LoopSUBS	R0, R0, #1BNE		LoopMOV		PC, LR    ; 把LR赋给PC,返回
(3)示例3,直接给PC赋值实现跳转
ADR指令参考文章
		ADR		LR, Ret    ; 伪指令,读取Ret标号的地址赋给LR,这是返回地址ADR		PC, Delay  ; 伪指令,读取Delay标号的地址赋给PC,直接跳转
RetMOV		R1, #1
DelayMOV		R0, #5
LoopSUBS		R0, R0, #1BNE		LoopMOV		PC, LR    ; 把LR赋给PC,返回
参考资料:
- 《DEN0013D_cortex_a_series_PG.pdf》P327、P328、P329
