打印

疑问:一个SPSR的奇怪表示方法:为什么要写成spsr_cf?

[复制链接]
2991|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xjc|  楼主 | 2007-3-13 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
疑问:一个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.

相关帖子

沙发
我爱喝水| | 2007-3-15 12:26 | 只看该作者

指定PSR的域

参见 
ADS_AssemblerGuide_B.pdf 184页 4-74
4.8.3 MSR 指令的解释
4.8.3 MSR
Load specified fields of the CPSR or SPSR with an immediate constant, or from the
contents of a general-purpose register.
Syntax
MSR{cond} <psr>_<fields>, #immed_8r
MSR{cond} <psr>_<fields>, Rm
where:
cond is an optional condition code (see Conditional execution on page 4-4).
<psr>
is either CPSR or SPSR.
<fields>
specifies the field or fields to be moved. <fields> can be one or more of:
c control field mask byte (PSR[7:0])
x extension field mask byte (PSR[15:8])
s status field mask byte (PSR[23:16)
f flags field mask byte (PSR][31:24]).
immed_8r is an expression evaluating to a numeric constant. The constant must
correspond to an 8-bit pattern rotated by an even number of bits within a
32-bit word.
Rm is the source register.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

xjc

14

主题

81

帖子

1

粉丝