ARM状态和Thumb状态间的切换
带状态切换的跳转指令:BX
汇编格式: BX{<cond>} Rm
功 能: BX 指令跳转到指令中所指定的目标地址,并实现状态的切换。Rm 是一个表达目标地址的寄存器。当Rm 中的最低位Rm[0] 为 1 时,强制程序从ARM 指令状态跳到Thumb 指令状态;当 Rm 中的最低位Rm[0]为0 时,强制程序从Thumb 指令状态跳到ARM 指令状态。
BX 指令示例
CODE32 ;ARM 程序段,32 位编码
arm1 ADR R0,thumb1+1 ;伪指令,把语句标号thumb1 所在地址
;赋给R0 ,末位R0[0] 置1 ,要跳转THUMB 指令集
;THUMB 指令集
MOV LR,PC ;设置返回地址
BX R0 ;跳转
ADD R1,R2,#2 ;返回地址处,第4 条指令
CODE16 ;THUMB 程序段, 16 位编码
thumb1 ADD R1,R3,#1 ;THUMB 程序
…
BX LR ;跳转到返回地址处,执行第4 条指令
分析:该例说明了带状态切换的子程序调用和返回的结构,ARM 程序段执行MOV LR,PC 语句时将返回地址保存到了LR 寄存器中。执行到BX 语句时 ,PC 指向下一个要执行的语句,此时PC(R15) 中的值为下一个语句ADD 指令所在的地址,并根据R0 中的bit[0] 实现了由ARM 状态切换到Thumb 状态。从而调用Thumb 子程序,子程序调用完后使用BX LR 指令,从而实现了子程序调用的返回并切换到ARM 状态。