当我切换到用户模式时,为什么我的CPSR会出现垃圾?

时间:2014-11-03 12:59:45

标签: assembly embedded arm kernel

启动玩具内核时,我使用此代码切换到用户模式:

  mrs r1, CPSR                  @ Switch to System mode
  orr r1, r1, #0xc
  msr CPSR, r1
  ldr sp, =gUsrStackBase        @ Setup USR stack (shared with System mode)
  mov  r1, #0x10                @ Get user-mode CPSR into SPSR
  msr  SPSR, r1
  movs pc, r0                   @ Switch to USR mode and branch

但遵循movs指令,而不是我设置的用户模式CPSR值(0x10),CPSR中存在随机垃圾。为什么会这样?

1 个答案:

答案 0 :(得分:1)

我非常非常长时间地对抗这个问题!最后我找到了问题的原因。在ARM体系结构参考手册(只有最新的ARMv7A -R版本!)[2]中,是这样的:

  

如果是,则在系统模式下执行的MSR(寄存器)是不可预测的   尝试更新SPSR。

(立即MSR也是如此。

解决方案是在设置SPSR之前切换回supervisor(或其他特权)模式。

[1]非常

[2]你可以在这里获得ARMv7-ARM(你需要注册):http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html