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

标签 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] !最后我找到了问题的原因。在 ARM 体系结构引用手册(只有最新的 ARMv7A -R 版本!)[2] 中,是这样的:

An MSR (register) executed in System mode is UNPREDICTABLE if it attempts to update the SPSR.



(对于立即数 MSR 也是如此)。

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

[1] 非常

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

关于assembly - 当我切换到用户模式时,为什么我的 CPSR 中会出现垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26714913/

相关文章:

c++ - 需要用 C 或 C++ 编写 MIPS 汇编程序,寻找一些设计建议

assembly - ARM64 汇编 - 堆栈上的 execve 参数

c - 使用 gnu gcc 编译器定义类型

c++ - 在一个 Makefile 中编译 C++ 和 C

optimization - 有效地将 YMM 寄存器的最低 64 位设置为常量

程序集在大数字之前打印字符

c - 如何解决 MISRA C :2012 Rule 11. 6?

c - 保护嵌入式设备的最佳实践

arm - 如何为多个组合的二进制文件设置构建

gcc - ARM + gcc : global destructors not called after main() returns, 但构造函数是