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

Assembly 当我切换到用户模式时,为什么我的CPSR中会出现垃圾?,assembly,embedded,arm,kernel,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 SP

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

  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中存在随机垃圾,而不是我设置的用户模式CPSR值(0x10)。为什么会这样?

很长一段时间以来,我一直在为这个问题绞尽脑汁!最后我找到了问题的原因。在ARM体系结构参考手册(仅最新的ARMv7A-R版本!)[2]中,是这样的:

在系统模式下执行的MSR(寄存器)如果 尝试更新SPSR

(这同样适用于带有即时消息的
MSR

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

[1] 非常


[2] 您可以在这里获得ARMv7 ARM(您需要注册):

FWIW,旧的ARM也有此信息,只是在不同的地方。在v6和v5中,“程序管理员模型”章节第2.5节“程序状态寄存器”中有这样的注释:“用户模式和系统模式没有SPSR,因为它们不是例外模式。在用户模式或系统模式下执行时,读取或写入SPSR的所有指令都是不可预测的。”v4在等效部分的末尾有一个类似的语句。我猜它在v7的早期版本中丢失了。您还应该指定完整的feild。像msr CPSF_fsxc一样,r1至少有一些汇编程序默认为单个字段(控件);最好是明确的。