SPSR与CPSR

原文:http://blog.chinaunix.net/uid-28458801-id-3487199.html

CPSR:程序状态寄存器(current program status register) (当前程序状态寄存器),在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。
CPSR在用户级编程时用于存储条件码。

   SPSR:程序状态保存寄存器(saved program status register),每一种处理器模式下都有一个状态寄存器SPSR,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断退出时,可以用SPSR来恢复CPSR。由于用户模式和系统模式不是异常中断模式,所以他没有SPSR。当用户在用户模式或系统模式访问SPSR,将产生不可预知的后果。

CPSR格式如下所示。SPSR和CPSR格式相同。
31     30     29    28     27     26               7     6     5     4     3     2     1     0
N      Z       C      V       Q     DNM(RAZ)     I      F     T     M4  M3   M2   M1  M0

***条件标志位***
N——本位设置成当前指令运算结果的bit[31]的值。当两个表示的有符号整数运算时,n=1表示运算结果为负数,n=0表示结果为正书或零。

Z——z=1表示运算的结果为零;z=0表示运算的结果不为零。对于CMP指令,Z=1表示进行比较的两个数大小相等。

C——下面分四种情况讨论C的设置方法:
在加法指令中(包括比较指令CMP),当结果产生了进位,则C=1,表示无符号运算发生上溢出;其他情况C=0。
在减法指令中(包括减法指令CMP),当运算中发生错位,则C=0,表示无符号运算数发生下溢出;其他情况下C=1。
对于包含移位操作的非加减运算指令,C中包含最后一次溢出的的位的数值。对于其他非加减运算指令,C位的值通常不受影响。

V——对于加减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号为溢出;通常其他指令不影响V位。

***Q标识位***
在ARM V5的E系列处理器中,CPSR的bit[27]称为q标识位,主要用于指示增强的dsp指令是否发生了溢出。同样的spsr的bit[27]位也称为q标识位,用于在异常中断发生时保存和恢复CPSR中的Q标识位。
在ARM V5以前的版本及ARM V5的非E系列的处理器中,Q标识位没有被定义。

***CPSR中的控制位***
CPSR的低八位I、F、T、M[4:0]统称为控制位。当异常中断发生时这些位发生变化。在特权级的处理器模式下,软件可以修改这些控制位。

**中断禁止位I,F:当I=1时禁止IRQ中断,当F=1时禁止FIQ中断

**T控制位:T控制位用于控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。对于ARM V4以更高版本的T系列ARM处理器,T控制位含义如下:
T=0表示执行ARM指令
T=1表示执行Thumb指令
对于ARM V5以及更高版本的非T系列处理器,T控制位的含义如下
T=0表示执行ARM指令
T=1表示强制下一条执行的指令产生未定指令中断

***M控制位***
M控制位控制处理器模式,具体含义如下:

M[4:0] 处理器模式    可访问的寄存器
ob10000 user     pc,r14~r0,CPSR
0b10001 FIQ      PC,R14_FIQ-R8_FIQ,R7~R0,CPSR,SPSR_FIQ
0b10010 IRQ      PC,R14_IRQ-R13_IRQ,R12~R0,CPSR,SPSR_IRQ
0B10011 SUPERVISOR    PC,R14_SVC-R13_SVC,R12~R0,CPSR,SPSR_SVC
0b10111 ABORT     PC,R14_ABT-R13_ABT,R12~R0,CPSR,SPSR_ABT
0b11011 UNDEFINEED    PC,R14_UND-R8_UND,R12~R0,CPSR,SPSR_UND
0b11111 SYSTEM     PC,R14-R0,CPSR(ARM V4以及更高版本)

***CPSR中的其他位***
这些位用于将来扩展。应用软件不要操作这些位。

(CPSR,SPSR)访问指令
ARM 微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传送数据,程序状态寄存器访问指令包括以下两条:
— MRS: 程序状态寄存器到通用寄存器的数据传送指令
— MSR: 通用寄存器到程序状态寄存器的数据传送指令

1、 MRS 指令
MRS 指令的格式为:MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
MRS 指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下几种情况:
- 当需要改变程序状态寄存器的内容时,可用MRS 将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
- 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:
MRS R0,CPSR ;传送CPSR 的内容到R0
MRS R0,SPSR ;传送SPSR 的内容到R0

2、 MSR 指令
MSR 指令的格式为:MSR{条件} 程序状态寄存器(CPSR 或SPSR)_<域>,操作数
MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为4 个域:
位[31:24]为条件标志位域,用f 表示;
位[23:16]为状态位域,用s 表示;
位[15:8]为扩展位域,用x 表示;
位[7:0]为控制位域,用c 表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR 指令中指明将要操作的域。
指令示例:
MSR CPSR,R0 ;传送R0 的内容到CPSR
MSR SPSR,R0 ;传送R0 的内容到SPSR
MSR CPSR_c,R0 ;传送R0 的内容到SPSR,但仅仅修改CPSR 中的控制位域

1 状态寄存器传送至通用寄存器类指令
功能:将状态寄存器的内容传送至通用寄存器。

格式:
MRS{<条件码>}Rd,CPSR}SPSR
其中:
Rd      目标寄存器,Rd不允许R15。
R=0     将CPSR中的内容传送目的寄存器。
R=1     将SPSR中的内容传送至目的寄存器。

注释:
MRS与MSR配合使用,作为更新PSR的读-修改-写序列的一部分。例如:改变处理器或清除标志Q。注意:当处理器在用户模式或系统模式下,一定不能试图访问SPSR这条指令,不影响条件码标志。
例:
MRS   R0,CRSR              ;将CPSR中的内容传送至R0
MRS   R3,SPSR              ;将SPSR中的内容传送至R3

2 .通用寄存器传送至状态寄存器传送指令
功能:将通用寄存器的内容传送至状态寄存器.

格式:
MSR{<条件码>CPSR_f|SPSR_f,<#ommed_8r>
MSR{<条件码>CPSR_<field>|SPSR_<field>,Rm
其中:
<field>字段可以是以下之一或多种:
C:控制域屏蔽字段(PSR中的第0位到第7位);
X:扩展域屏蔽字段(PSR中的第8位到第15位);
S:状态域屏蔽字段(PSR中的第16位到第32位);
F:标志域屏蔽字段(PSR中的第24位到第31位)。
immed_8r 值数字常量的表达式。常量必须对应8位位图。该位图在32位字中循环移位偶数数位。
Rm        源寄存器。

注释:
同前一条指令(MRS)。
例1:设置N、Z、C、V标志。
MSR    CPSR_f,#&f0000000            ;仅高位有效,其他必须为0
例2:
仅置位C标志,保留N、Z、V标志。
MRS    R0,CPSR                    ;将CPSR中的内容传送至R0
ORR    R0,R0,#&1f                ;置位R0的第29位
MSR    CPSR_c,R0                   ;再将R0中的内容传送至CPSR

时间: 2024-10-22 13:01:01

SPSR与CPSR的相关文章

CPSR和SPSR(转)

转载地址:http://blog.chinaunix.net/uid-28458801-id-3487199.html CPSR:程序状态寄存器(current program status register) (当前程序状态寄存器),在任何处理器模式下被访问.它包含了条件标志位.中断禁止位.当前处理器模式标志以及其他的一些控制和状态位.CPSR在用户级编程时用于存储条件码.    SPSR:程序状态保存寄存器(saved program status register),每一种处理器模式下都有

转:AM335x启动流程(BootRom-&gt;MLO-&gt;Uboot)

http://blog.chinaunix.net/uid-28458801-id-3486399.html 参考文件: 1,AM335x ARM Cortex-A8 Microprocessors (MPUs) Technical Reference Manual.pdf: 2,am3359.pdf: 1,am335x的cpu上电后,会跳到哪个地址去执行? 答: 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img AM335x 中bootloader被分成了 3 个

一个简单的基于MINI2440开发板的启动代码

1. S3C2440大概的启动流程(NAND启动): ①设置CPU为SVC模式 ②关闭看门狗 ③屏蔽中断 ④关闭MMU ⑤初始化时钟 ⑥初始化内存(SDRAM) ⑦初始化栈指针(SP, R13) ⑧初始化NAND Flash ⑨拷贝代码从NAND到内存 ⑩清除BSS段 最后,跳转至C语言的Main函数执行 2. 汇编语言源代码 .text .global _start _start: b reset ldr pc, _undifined_instruction ldr pc, _software

嵌入式学习笔记006-裸奔篇之中断

在讲解中断时有必要理清一些关系: 中断和异常 1.中断: a.可屏蔽中断(maskable): I/O设备发出的中断请求(irq)都属于.可处于两种状态:屏蔽的/非屏蔽的. b非屏蔽中断(nonmaskable): 只有几个危急事件才引起.总是由CPU辨认. 2.异常: a.处理器探测异常:当CPU执行指令时探测到一个反常条件所产生的异常. 根据保存在eip寄存器中的值,分为3种; 1)故障(fault):通常可以被纠正.eip中保存的是引起故障的指令地址.纠正后会重新执行该条指令. ; 2)陷

汇编指令大全

blt   小于跳转 tst r0,#02 bne sleep ldr  r1,#0 解释:位比较,先进行and运算,如果r0第2位不为1,则与的结果为0,设置标志位zero=1,继续下面的ldr指令.反之,zero=0,跳转到sleep执行. bne指令: 非零则跳转 个人总结:tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处). tst 和beq连用: 先是用tst进行位与运算,然后将位

ARM汇编指令汇总

1.ARM汇编的格式:    在ARM汇编里,有些字符是用来标记行号的,这些字符要求顶格写:有些伪码是需要成对出现的,例如ENTRY和END,就需要对齐出现,也就是说他们要么都顶格,要么都空相等的空,否则编译器将报错.常量定义需要顶格书写,不然,编译器同样会报错.    2.字符串变量的值是一系列的字符,并且使用双引号作为分界符,如果要在字符串中使用双引号,则必须连续使用两个双引号.    3.在使用LDR时,当格式是LDR r0,=0x022248,则第二个参数表示地址,即0x022248,同

ARM体系结构与汇编指令

<朱老师物联网大讲堂>学习笔记 学习地址:www.zhulaoshi.org (1). ASIC专用芯片 到 可编程器件, CPU在固定频率下,读取/解析/执行指令, 二进制文件被CPU读取进去,CPU内部电路对二进制文件解码, (2). 指令集对CPU的意义, 汇编语言:机器指令助记符, 机器指令是CPU设计者制定的,CPU内部电路设计就是为了实现这些指令集的功能,机器指令就好像CPU的API接口一样, 不同CPU的机器指令集设计不同, (3). RISC和CISC的区别, CISC:com

ATMEL精妙的IRQ中断处理过程

A: 从栈地址开始,栈顶为AT91SAM7S64的16K片内RAM尽头0x00204000IRQ_STACK_SIZE = 3*8*4FIQ_STACK_SIZE = 0x004ABT_STACK_SIZE = 0x004UND_STACK_SIZE = 0x004SVC_STACK_SIZE = 0x800SYS_STACK_SIZE = 0x400 irq栈为什么用3*8*4=96B呢?因为irq最多8级嵌套,ARM字长4B,而3,是由于每次进栈均破坏了3个寄存器r0.spsr.lr,所以需

os_cpu_a.asm

在OS_CPU_A.ASM中,定义了开.关中断的方法,在uC/OS-II系统中有三种方法可以实现中断开关,而ARM只适用于模式三,即使用一个局部变量,在中断进入之间保存CPU状态,退出时候再恢复状态. OSStart()函数调用OSStartHighRdy()来使就绪态任务中优先级最高的任务开始运行,OSStartHighRdy()必须调用OSTaskSwHook(),调用完STaskSwHook()后,应该使OSRunning标志位为TRUE,最后再切换到最高优先级任务.此函数只是完成了高优先