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至少有一些汇编程序默认为单个字段(控件);最好是明确的。