疑问:一个SPSR的奇怪表示方法:为什么要写成spsr_cf?
在超级用户模式下使用 SWI 当执行 SWI 指令时: 1. 处理器进入超级用户模式 2. CPSR 被存储在 spsr_SVC 中。 3. 返回地址被存储在 lr_SVC 中(请参阅第 6-7 页的处理器对异常的反应)。 如处理器已经处在超级用户模式下,lr_SVC 和 spsr_SVC 被破坏。 在超级用户模式下,如果调用 SWI,则需存储 lr_SVC 和 spsr_SVC,以确保链接寄存器和 SPSR 中的初始值不被丢失。例如,一个特定 SWI 编号的处理程序例程调用了另一个 SWI,必须确保该该处理程序例程将 lr_SVC 和 spsr_SVC 存储在堆中。它确保了处理程序的每一次调用都保存了返回到调用 SWI 指令所需要的信息。
STMFD sp!,{r0-r3,r12,lr} ; Store registers. MOV r1, sp ; Set pointer to parameters. MRS r0, spsr ; Get spsr. STMFD sp!, {r0} ; Store spsr onto stack. LDR r0,[lr,#-4] ; BIC r0,r0,#0xFF000000 ;
BL C_SWI_Handler ; Call C routine to handle the SWI.
LDMFD sp!, {r0} ; Get spsr from stack. MSR spsr_cf, r0 ; Restore spsr.为什么要写成spsr_cf? LDMFD sp!, {r0-r3,r12,pc}^ ; Restore registers and return.
|