当前位置: 代码迷 >> 汇编语言 >> arm汇编bootloader小白有关问题
  详细解决方案

arm汇编bootloader小白有关问题

热度:144   发布时间:2016-05-02 04:30:33.0
arm汇编bootloader小白问题
小弟不才,最近开始学习汇编,看到网上的一个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中标志位时怎么读取?