注:内容来源 《ARM Cortex-A(armV7)编程手册V4.0》,只用于学习记录。
最近在看韦东山 imx6ull 裸机的汇编启动文件,看到一条比较陌生的汇编指令CPS(如下图所示),于是把它记录下来。
通过在《ARM Cortex-A(armV7)编程手册V4.0》中搜索 “CPS”,在 5.6.3 PSR modification 章节可以找到这样一句话,如下图高亮文字:
意思就是: 在特权模式下(除了用户模式,剩余的模式都是特权模式),可以通过CPS指令直接修改CPSR寄存器的M[4:0],让处理器进入不同的模式。
CPSR 的寄存器结构相同,如下图所示:
其中M[4:0] 就是处理器的模式控制为,不同的编码对应着不同的处理器模式,如下图所示:
所以:
CPS #0x12 /*把CPSR寄存器的M[4:0]修改为0x12,让处理器进入IRQ 模式*/
CPS #0x13 /*把CPSR寄存器的M[4:0]修改为0x13,让处理器进入SVC 模式*/
注:当然,我们也可以使用MRS、MSR指令通过 读、修改、写回 的方式,修改CPSR寄存器的M[4:0],让CPU进入不同的模式。只是,我觉得使用CPS指令更快速高效,只需一条指令即可。