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