Thumb指令集之: Thumb跳转指令
该指令类似于ARM指令集的BL <target_addr>集的BL <target_addr>。
11.3.4 带状态切换的跳转指令BX
(1)编码格式
带状态切换的跳转指令BX的编码格式如图11.5所示。
图11.5 BX指令的编码格式
BX指令用于ARM和Thumb程序之间的调用。
(2)指令的语法格式
BX <Rm>
其中<Rm>为目标地址寄存器,包含程序的跳转地址。BX指令的目标地址寄存器可以是r0~r15中的任意寄存器。
| 注意 | 如果Rm[1:0]=0b10,不满足ARM指令的内存对齐方式。指令的执行结果不可预知。如果该指令使用r15作为目标寄存器,其操作方式和使用其他寄存器相同。 |
(3)指令操作的伪代码
T Flag=Rm[0]
PC=Rm[31:1]<<1
(4)ARM指令集中的BX指令
ARM指令集中的BX指令和Thumb指令集中的BX指令相差较大,它们分别为不同方向的跳转。当r15作为目的寄存器使用时,要特别注意该指令在两个指令集中的区别。
11.3.5 带返回链接的无条件跳转指令BLX(2)
(1)编码格式
带返回链接的无条件跳转指令BLX(2)的编码格式如图11.6所示。
图11.6 BLX(2)指令的编码格式
该BLX(2)指令用于ARM和Thumb子程序间的相互调用。程序状态字的T标志位根据目的寄存器的bit[0]位而改变。
(2)指令的语法格式
BLX <Rm>
其中<Rm>为目标地址寄存器,r0~r14寄存器均可以做为目标地址寄存器。
| 注意 | 如果在此指令中使用r15作为目的寄存器,指令的执行结果不可预知。 |
此指令只在ARMv5版本以上指令集中被支持。
(3)指令操作的伪代码
LR = (address of the instruction after this BLX)|1
T Flag = Rm[0]
PC = Rm[31:1]<<1
11.3.6 Thumb指令集中跳转指令举例
下面的例子程序综合使用了各种跳转指令,通过该例可以对Thumb状态下程序的非连续执行有更深入的了解。
B label ;无条件跳转到Label地址
BCC label ;如果进位标志为0,则跳转
BEQ label ;如果零标准位置1,则跳转
BL func ;子程序调用
Func
…
… ;子程序体
MOV PC,LR ;子程序返回
BX r12 ;跳转到r12寄存器中保存的地址
在执行此例中的BX r12时,如果r12的bit[0]=0,则处理器进入ARM状态执行,否则继续执行Thumb代码。
- Thumb指令集之: Thumb指令的特点及实现(08-30)
- Thumb指令集之: Thumb指令应用(08-30)
- Thumb指令集之: ARM和Thumb的混合编程(08-30)
- Thumb指令集与ARM指令集的区别(11-21)
- Thumb指令集之: Thumb指令应用(09-30)
- Thumb指令集之: 多寄存器数据传送指令(09-30)