问题一:MOV是怎么影响CPSR的
问题二:求证对BX用最后一位标志状态切换的一点猜想
程序代码如下:
AREA EX,CODE,READONLY
ENTRY
MAIN ADR RO,THUMBCODE+1
BX RO
CODE16
THUMBCODE MOV R2,#1
MOV R3,#2
ADD R2,R2,R3
ADR R0,ARMCODE
BX RO
CODE32
ARMCODE MOV R4,#3
MOV R5,#4
ADD R4,R5,R3
B MAIN
END
本人有预先猜想求证
1.跳转是通过修改pc完成的,无论thumb和ARM地址的都是按照最少2的倍数递增的,因此地址最后一位一直为0,所以BX指令可以通过最后一位标示要跳转的是thumb还是ARM指令
例如ARM指令pc从8004到8008最后一位的二进制是0100到1000,thumb的8004到8006最后一位是0100到0110
这样想对吗?
2.如果我在thumb中直接通过一个B指令分支到一个ARM指令行会出现什么样的情况呢?
小弟新入分数比较少,请各位体谅
------解决方案--------------------
1. 基本上可以这么理解
2. B指令不带状态切换,所以通过B从thumb跳转到arm指令的结果不确定,最大的可能是取指异常,也有可能碰巧解码出来是合法的thumb指令,执行结果就难说了。。。
------解决方案--------------------
MOV 指令的格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S
选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位
的值。
------解决方案--------------------
执行MOVS,一定会影响N,Z,C标志
比如MOVS r0, #1,执行后r0=1
Z=!r0=0; 是否为0
N=r0>>31=0;符号位
C=!(r0 >= 0)=0;是否有进位
SPSR是进入内核态时,比如进入中断,对CPSR的备份(spsr=cpsr),退出内核态时,再恢复回来(cpsr=spsr)