MOVS的一些遐想

今天在看深入浅出,看到启动代码那一块一点小疑惑就上网查了下,问题解决!

源代码是这样:


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的最低位来切换处理器状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值