(六)ARM状态寄存器-PSR

本文详细介绍了ARM架构中的程序状态寄存器CPSR和SPSR的作用及结构,包括其在处理异常过程中的重要功能。同时,还阐述了状态寄存器中的关键位及其在处理器工作模式中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ARM程序状态寄存器Program State Register

在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的特殊组寄存器才可以使用.

CPSR

当前程序状态寄存器 (Current Program State Register)

SPSR

保存的程序状态寄存器 (Saved Program State Register), 有6个,主要是在处理异常的时候使用.

每一种处理器模式下都有一个专用的物理寄存器作为备份的程序状态寄存器SPSR , 当特定的异常发生时,这个物理寄存器负责保存CPSR当前程序状态寄存器的内容, 当异常处理程序返回时,再将内容恢复到当前程序状态器中,继续向下执行原来程序.

结构解析

CPSR和保存它的SPSR寄存器因为都属于状态寄存器PSR,因此它们的结构相同,如下:

  • 保存最近的逻辑或者算术操作的信息;
  • 控制中断时使能;
  • 设置处理器的工作模式;

状态寄存器的各个位的功能如下图:

其中,着重要注意的是高4位(28-31)和低8位(0-7). 
注意: 
DNM(Do Not Modify):不同通过软件进行赋值; 
条件标志位(Condition code flags): N,Z,C,V. 这些位可以通过逻辑或者算术操作, 或者 MSR 和 LDM 指令来操作. 处理器会测试这些标志位,以确定是否操作一些指令.

控制位(低8位 I,F,T,M[4:0]),当发生异常时, 这些为的值将发生相应的变化.在特权模式下,也可以通过软件来修改这些位.用的比较多.

 

转载于:https://www.cnblogs.com/zhangshenghui/p/5944964.html

<think>我们正在讨论ARM架构中的状态寄存器。根据引用[2],状态寄存器用于存储CPU的状态信息,如标志位、中断使能状态等。其中,程序状态寄存器PSR)是ARM架构中一个重要的状态寄存器,它包含多个子寄存器-应用程序状态寄存器(APSR):存储条件码标志位(如N、Z、C、V等)。 -中断程序状态寄存器(IPSR):指示当前正在处理的中断。-执行程序状态寄存器(EPSR):存储控制位,如中断使能位。此外,引用[4]提到在异常处理(如PendSV_Handler)中,会使用MRS和MSR指令来读取和修改PSP(进程堆栈指针)以及保存和恢复寄存器状态。现在,我将详细介绍ARM架构中的状态寄存器。###ARM架构状态寄存器详解在ARM架构中,状态寄存器(ProgramStatus Register, PSR)用于存储和反映处理器的当前状态。它由几个子寄存器组成,这些子寄存器ARMv7及以后的架构中被统一称为`xPSR`(其中x表示组合)。状态寄存器主要包含以下三个部分:1.**应用程序状态寄存器(APSR)**存储算术和逻辑运算的结果标志位,这些标志位用于条件执行。主要标志位包括:-**N(Negative)标志**:当运算结果为负数时置1(即最高位为1)。-**Z(Zero)标志**:当运算结果为零时置1。-**C(Carry)标志**:当运算产生进位(无符号数溢出)时置1。-**V(oVerflow)标志**:当运算产生有符号数溢出时置1。这些标志位在条件分支指令(如`BEQ`, `BNE`等)中被使用。2.**中断程序状态寄存器(IPSR)**指示当前正在处理的中断或异常编号。例如,当处理器正在处理一个SysTick中断时,IPSR中会存储该中断对应的异常号。 3. **执行程序状态寄存器(EPSR)**包含控制处理器执行状态的位,例如:-**ICI/IT块状态位**:用于中断继续指令(ICI)和If-Then(IT)指令块的状态。-**T位**:指示当前指令集(Thumb或ARM)。在Cortex-M系列中,T位始终为1,表示运行在Thumb状态。在Cortex-M系列中,这三个子寄存器被组合成一个32位的寄存器,称为`xPSR`。其结构如下(以32位为例):``` 3130292827...2423161510987650NZCVQ保留ICI/IT保留TICI/IT异常号[8:0] ```####访问状态寄存器在汇编语言中,可以使用`MRS`(MovetoRegister fromSpecialregister)和`MSR`(Moveto Specialregister fromRegister)指令来读写状态寄存器。例如: ```assemblyMRSR0, APSR;将APSR的值读取到R0MSRAPSR,R0;将R0的值写入APSR```####状态寄存器的应用状态寄存器在异常处理、上下文切换和多任务系统中扮演重要角色。例如,在RTOS的上下文切换中(如引用[4]所述),需要保存和恢复任务的状态寄存器值,以确保任务状态的一致性。 §§相关问题§§1.状态寄存器中的条件标志位(N、Z、C、V)是如何在具体运算中设置的? 2.在ARMCortex-M系列中,状态寄存器在异常处理流程中的作用是什么? 3.如何通过汇编指令修改状态寄存器的特定标志位?</think>### ARM架构状态寄存器详解 在ARM架构中,状态寄存器(Program Status Register, PSR)是存储CPU核心状态信息的关键组件,它包含处理器的当前状态、条件标志位和操作模式等信息。根据引用[2]的描述,状态寄存器主要由三个子寄存器组成: #### 1. **应用程序状态寄存器(APSR)** 存储算术和逻辑运算的结果标志位: - **N(Negative)标志**:当运算结果为负数时置位(最高位为1) - **Z(Zero)标志**:当运算结果为零时置位 - **C(Carry)标志**:当运算产生进位/借位时置位 - **V(oVerflow)标志**:当有符号数运算溢出时置位 - **Q(saturation)标志**:当发生饱和运算时置位(仅ARMv5TE及以上) 示例:执行`SUBS R0, R1, R2`后: - 若R1<R2,则N=1(结果为负) - 若R1=R2,则Z=1(结果为零) - 若R1>R2且无借位,则C=1 #### 2. **中断程序状态寄存器(IPSR)** 存储当前异常/中断状态: - **Exception Number字段**:标识正在处理的中断类型(如SysTick=15, SVC=11) - **执行状态**:指示处理器是否处于异常处理程序内 #### 3. **执行程序状态寄存器(EPSR)** 存储处理器执行状态: - **ICI/IT块状态**:支持中断继续指令和If-Then指令块 - **T位**:指示当前指令集(Thumb/ARM),在Cortex-M中固定为1(Thumb状态) - **中断使能位**:控制全局中断开关(如PRIMASK寄存器--- ### 组合访问方式 在ARMv7-M架构中,这三个寄存器被组合为**xPSR**(32位复合寄存器),可通过特殊指令访问: ```assembly MRS R0, APSR ; 单独读取APSR MSR APSR_nzcvq, R1 ; 写入APSR的条件标志位 MSR IPSR, R2 ; 写入中断状态(仅特权模式) ``` --- ### 关键功能与应用 1. **条件执行** 如`ADDEQ R3, R4, R5`仅在Z=1时执行加法,提升代码效率[^2]。 2. **异常处理** 进入异常时自动保存xPSR到堆栈,退出时恢复: ```assembly ; 异常入口自动行为 PUSH {LR, xPSR, PC, R0-R3} ; 硬件自动完成 ``` 3. **上下文切换** 如引用[4]所示,RTOS切换任务时需完整保存/恢复xPSR: ```assembly PendSV_Handler: MRS R0, PSP ; 获取任务堆栈指针 STMFD R0!, {R4-R11, LR} ; 保存寄存器包括LR MRS R1, xPSR ; 读取当前状态 STMFD R0!, {R1} ; 保存xPSR状态 ; ...任务切换代码... ``` 4. **安全控制** - 通过CONTROL寄存器管理堆栈指针选择(MSP/PSP) - 特权模式可通过写入APSR修改条件标志 --- ### 不同架构的差异 | 架构系列 | 状态寄存器特点 | |--------------|-----------------------------------| | Cortex-M | 强制Thumb状态(T=1),统一xPSR访问 | | Cortex-A | 支持ARM/Thumb状态切换,有CPSR/SPSR | | Cortex-R | 双寄存器组备份,支持快速中断响应 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值