小弟不才,最近开始学习汇编,看到网上的一个bootloader源码如下
1. 第一部分
功能:关闭中断,进入ARM状态,切换到SVC模式(复位异常进入SVC 模式)。
MRS r0, cpsr
把状态寄存器CPSR中数据读入r0 寄存器。
BIC r0, r0, #MASK_MODE
(MASK_MODE = 0x0000003F)把 r0 寄存器的低6位清零。(把Thumb状态为清零,回到ARM状态)
ORR r0, r0, #MODE_SVC32
(MODE_SVC32 = 0x00000013)把r0 寄存器的低5置为 10011(SVC模式)。
ORR r0, r0, #I_BIT
(I_BIT = 0x80)把r0 寄存器的第8位置1(关闭中断状态位)。
ORR r0, r0, F_BIT
(F_BIT = 0x40 )把r0 寄存器的第7位置1(关闭快速中断状态位)。
MSR cpsr_c, r0
把r0 寄存器的低8位存储进CPSR寄存器的低8位。
我理解的意思就是初始化 cpsr
想问下为什么不直接向
这样呢?
mov r0,0xd3
MSR cpsr_c, r0
或者直接
MSR cpsr_c, 0xd3
呢?
------解决思路----------------------
实际你连那两句都可以省了,因为目前的arm核心在复位态自动进入arm/svc模式,并且所有中断禁止。但是软件人员不应该依赖于硬件假设,所以自己主动置这种状态。
至于r0的操作完全看自己习惯了,可以像你那样直接赋值。而对cpsr的操作必须通过通用寄存器来完成,不能直接赋值,我记忆中是这样的,好久不做arm,回家查查,不对的话再纠正。
------解决思路----------------------
这个是保留寄存器原有的设置而不是将其余位都置为零;
这里可能直接写低6位没有问题,不会出现错误;
但是如果有哪个厂商在这里有特殊的设置,你那么设置不是破坏了原有寄存器的状态了吗?
如果后面的程序需要读取cpsr中标志位时怎么读取?