今天在看深入浅出,看到启动代码那一块一点小疑惑就上网查了下,问题解决!
源代码是这样:
SoftwareInterrupt
CMP R0,#4 //判断传过来的参数是否大于4
LDRLO PC,[PC,R0,LSL #2] //小于4(参数正确),PC = PC + R0*4进行查表
MOVS PC,LR //大于或者等于4,则返回
这里前面的部分都已经讲了,现在就MOVS PC,LR讲解下,其实就是整理论坛上别人的观点!哈哈,网络真好
!让世界联通起来!
首先MOV一般不影响CPSR,除非执行类似MOV pc,lr;效果等同于BX LR;
MOVS总是会影响CPSR,包括N,Z,C标志位。执行MOV PC,LR;可能会影响到T标志位,执行MOVS PC,LR时,
CPSR会被SPSR覆盖(内核态)
在Thumb代码里不能使用B跳转到ARM代码,因为T标志不会切换,即使跳到ARM代码,也会按照Thumb方式来执行,
BX是跳特殊指令,会根据目标寄存器地址来切换T标志。
看到这里,肯定会有人对BX感兴趣了,那我们来看看BX吧!
BX 带状态切换的跳转指令。跳转到Rm指定的地址执行程序,若Rm的位【0】为1,则跳转时自动将CPSR中的标
志位T置位,即把目标地址的代码解释为Thumb代码;若Rm的位【0】为0,则跳转时自动将CPSR中的标志位T置位
,即把目标地址的代码解释为arm代码,
指令格式如下:
BX{cond} Rm
带状态切换的跳转指令BX举例如下:
ADRL R0,ThumbFun+1
BX R0 ;跳转到R0指定的地址,并根据R0的最低位来切换处理器状态