这是ARM的bootloader的起始代码,并将CPU配置为svc模式:
1) mrs r0, cpsr
2) bic r0, r0, #0x1F
3) orr r0, r0, #0xD3
4) msr cpsr, r0
我的问题是为什么我们必须使用第一条指令“msr r0,cpsr”?我的意思是我们不能只使用2)3)获得0xD3并直接写入cpsr? 1)服务到底是什么?
答案 0 :(得分:2)
CPSR
包含更多状态,然后只是cpu模式。
例如,它包含State bit
,告知CPU是在ARM模式还是在Thumb模式下执行。
在不保留其他状态的情况下写入CPSR很可能会使cpu进入未定义状态。因此,你总是进行读 - 修改 - 写。
在大多数documents from ARM中,还指出了保留保留位状态以便将来兼容的重要性。
保持与未来ARM处理器的兼容性,同样如此 实践中,强烈建议您使用读 - 修改 - 写策略 当你改变CPSR时。
答案 1 :(得分:1)
实际上,指令2和3操纵位7,6和4,3,2,1,0:
我被设置(屏蔽IRQ) F设置(Masking FIQs)
MODE设置为0b10011
由于读取 - 修改 - 写入序列(顺便回答关于指令1的有用性的问题),左位未改变。