0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CPSR寄存器和APSR寄存器的组成

嵌入式那些事 来源: 嵌入式那些事 2023-10-20 11:38 次阅读

程序状态寄存器的作用就是反映处理器的状态信息。在程序运行期间我们可以通过查看程序状态寄存器的状态位来进行程序的分支跳转处理,或者我们可以设置程序状态寄存器的模式位来改变处理器的运行模式,或者我们可以设置程序状态寄存器的中断屏蔽位来屏蔽中断。

在任何时刻,我们可以访问处理器的16个寄存器(R0~R15)和当前程序状态寄存器(Current Program Status Register,CPSR)。用户模式下的程序访问的程序状态寄存器叫做APSR(Application Program Status Register),APSR是CPSR在用户模式下的别名,因为在用户模式下CPSR的部分域是不能操作的,因此CPSR的部分域被屏蔽后就是APSR。

CPSR寄存器组成

在所有模式下均可以访问到CPSR,只是在用户模式下CPSR的部分域是不能操作的,当前程序状态寄存器(CPSR)的位组成如下图所示:

c50c51e8-6e9f-11ee-939d-92fbcf53809c.png

Snipaste_2023-09-08_20-34-48

各个位域的说明如下:

标志 说明
31 N 当运算结果为负且运算指令要求更新寄存器时,该位会被置位。
30 Z 当运算结果为0且运算指令要求更新寄存器时,该位会被置位。
29 C 当运算结果产生进位且指令要求更新寄存器时,该位会被置位。
28 V 当运算结果产生符号位溢出且指令要求更新寄存器时,该位会被置位。
27 Q cumulative saturation。
26:25 IT[1:0] IT位,由IT[7:2]和IT[1:0]组成,Thumb指令集中IT指令的If-Then执行状态。
24 J 指示ARM是否处于Jazelle状态。
19:16 GE[3:0] 被一些SIMD(Single Instruction Multiple Data)指令使用。
15:10 IT[7:2] 见IT[1:0]的描述。
9 E 指示处理器的大小端模式,同时可以通过设置该位来修改处理器的大小端模式,1表示大端模式,0表示小端模式。
8 A 是否屏蔽异步终止,该位为1时表示屏蔽异步终止,为0时表示打开异步终止。
7 I 是否屏蔽IRQ,该位为1时表示屏蔽IRQ,为0时表示打开IRQ。
6 F 是否屏蔽FIQ,该位为1时表示屏蔽FIQ,为0时表示打开FIQ。
5 T 指示ARM是否处于Thumb状态。J和T标志共同决定处理器使用的指令集。J=0,T=0:ARM指令集;J=0,T=1:Thumb指令集;J=1,T=0:Jazelle指令集;J=1,T=1:ThumbEE指令集。
4:0 M[4:0] 指示处理器的模式,同时可以通过设置该位域来修改处理器的模式。

处理器各个模式的编码如下图所示:

c5190b18-6e9f-11ee-939d-92fbcf53809c.png

Snipaste_2023-09-01_20-59-03

APSR寄存器组成

在用户模式下,用户程序能够操作的CPSR寄存器位域是有限制的,对CPSR寄存器的部分位域屏蔽之后就是APSR了,应用程序状态寄存器(APSR)的位组成如下图所示:

c52a3190-6e9f-11ee-939d-92fbcf53809c.png

Snipaste_2023-09-11_20-03-04

从上图可以看出,APSR只能访问N,Z,C,V,Q和GE[3:0]这些标志位,这些标志位的含义和CPSR中对应标志位的含义一样。

SPSR

备份程序状态寄存器(Saved Program Status Register,SPSR)主要用于存储前一个执行模式的CPSR。FIQ、IRQ、ABT、SVC和UND模式,都有他们自己模式下专用的SPSR。在处理器发生中断或者异常时,处理器会自动的从一个模式A进入到另一个模式B,模式A的CPSR/APSR将会自动保存到模式B的SPSR中,这样模式B中的处理程序能够通过访问SPSR寄存器得到模式A下CPSR寄存器的信息。

程序状态寄存器操作指令

CPS指令

可以通过CPS(Change Processor State)指令来修改处理器模式。CPS指令也可以用来使能或者禁止异常。

CPS指令的语法如下所示:

CPS #mode
CPSIE iflags{, #mode}
CPSID iflags{, #mode}

mode是处理器的模式编码,比如在从其他模式下切换到SYS模式,使用下述代码即可:

# 切换到SYS模式
CPS #0x1f

IE使能中断或者终止。

ID禁止中断或者终止。

iflags由下面的一种或者几种组成:

a:表示异步终止(asynchronous abort);

i:表示中断(IRQ);

f:表示快中断(FIQ);

下述代码是CPS指令的一些简单用法:

# 使能中断
CPSIE I

# 禁止中断
CPSID I

# 使能异步终止和快中断
CPSIE AF

# 禁止异步终止和快中断
CPSID AF

# 使能中断并切换到SYS模式
CPSIE I, #0x1f

MRS与MSR指令

MRS和MSR指令可用于读写程序状态寄存器CPSR,APSR和SPSR。

在ARM处理器中,只有MRS指令可以从程序状态寄存器CPSR,APSR和SPSR中读出数据到通用寄存器中。MRS指令操作程序状态寄存器的语法如下:

MRS{cond} Rd, psr

cond为条件码。

Rd为目标寄存器,Rd不允许为R15。

psr为程序状态寄存器CPSR,APSR或者SPSR。

MRS指令的示例代码如下所示:

# 将CPSR寄存器的值读取到R0中
MRS R0, CPSR

# 将SPSR寄存器的值读取到R1中
MRS R1, SPSR

# 将APSR寄存器的值读取到R2中
MRS R2, APSR

MSR指令可以用来写程序状态寄存器CPSR,APSR和SPSR的全部或者部分域。MSR指令操作程序状态寄存器的语法如下:

MSR{cond} psr, #constant
MSR{cond} psr, Rm
MSR{cond} psr_fields, #constant
MSR{cond} psr_fields, Rm

cond为条件码。

psr为程序状态寄存器CPSR或者SPSR。

constant是一个8位立即数。ARM文档对于constant的介绍如下:

constant is an 8-bit pattern rotated by an even number of bits within a 32-bit word. (Not available in Thumb.)

Rm是源寄存器。

fields由下面的一个或者多个组合而成:

c:xPSR[7:0],控制位域;

x:xPSR[15:8],扩展位域;

s:xPSR[23:16],状态位域;

f:xPSR[31:24],标志位域;

MSR指令的示例代码如下所示:

# 切换到SYS模式
MRS R0, CPSR
ORR R0, R0, #0x1f
MSR CPSR, R0

# 切换到SYS模式
MSR CPSR_c, #0xDF

只有在除用户模式外的其他模式下才能够修改状态寄存器。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    19275

    浏览量

    229747
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9091

    浏览量

    367473
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120297
  • 中断
    +关注

    关注

    5

    文章

    898

    浏览量

    41486
  • 程序
    +关注

    关注

    117

    文章

    3786

    浏览量

    81023

原文标题:ARMv7-A 那些事 - 3.程序状态寄存器

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    寄存器是什么?怎么操作寄存器点亮LED灯?

    寄存器,是集成威廉希尔官方网站 中非常重要的一种存储单元,通常由触发组成。在集成威廉希尔官方网站 设计中,寄存器可分为威廉希尔官方网站 内部使用的寄存器和充当内外部接口的
    的头像 发表于 07-21 16:59 4027次阅读
    <b class='flag-5'>寄存器</b>是什么?怎么操作<b class='flag-5'>寄存器</b>点亮LED灯?

    寄存器与移位寄存器

    寄存器与移位寄存器 寄存器是用来寄存数码的逻辑部件,所以必须具备接收和寄存数码的功能。任何一种触发
    发表于 03-12 15:19 59次下载

    第二十六讲 寄存器和移位寄存器

    第二十六讲 寄存器和移位寄存器7.4.1 寄存器1.定义2.威廉希尔官方网站 举例 3.逻辑功能分析7.4.2 移位寄存器一、单向移位寄存器㈠ 由4个维持
    发表于 03-30 16:30 9634次阅读
    第二十六讲 <b class='flag-5'>寄存器</b>和移位<b class='flag-5'>寄存器</b>

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理内的组成部分。
    发表于 03-08 14:26 2.2w次阅读

    数据寄存器,数据寄存器是什么意思

    数据寄存器,数据寄存器是什么意思 数据寄存器数据寄存器包括累加AX、基址寄存器BX、计数
    发表于 03-08 14:38 1.3w次阅读

    移位寄存器,移位寄存器是什么意思

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    发表于 03-08 14:50 1.8w次阅读

    寄存器与移位寄存器

    寄存器与移位寄存器:介绍寄存器原理和移位寄存器的原理及实现。
    发表于 05-20 11:47 0次下载

    浅谈ARM寄存器组织

    3.3 ARM寄存器组织 ARM处理有37个32位长的寄存器。 1个用作PC(Program Counter)。 1个用作CPSR(Current Program Status Re
    发表于 10-18 13:26 1次下载
    浅谈ARM<b class='flag-5'>寄存器</b>组织

    dptr是什么寄存器_dptr由几个寄存器组成

    dptrDPTR是一个16位的专用地址指针寄存器,由两个独立的8位寄存器组成
    发表于 12-27 15:46 2.8w次阅读

    寄存器由什么组成

    本文首先介绍了寄存器的原理组成,其次介绍了ARM寄存器组成,最后介绍了寄存器的用途。
    的头像 发表于 08-21 18:33 3.7w次阅读

    AD转换寄存器设置

    AD转换寄存器设置AD转换寄存器设置AD转换寄存器设置
    发表于 11-10 17:36 16次下载
    AD转换<b class='flag-5'>寄存器</b>设置

    GPIO寄存器

    每组IO口有10个寄存器组成,如果芯片有GPIOA~GPIOI,9个组那么一共有90个寄存器如果配置一个IO口需要2个位,那么刚好32位寄存器配置一组IO口16个IO口如果配置一个IO
    发表于 12-08 17:06 5次下载
    GPIO<b class='flag-5'>寄存器</b>

    ARM通用寄存器及状态寄存器详解

    笔者来聊聊ARM通用寄存器以及状态寄存器的认识与理解。
    的头像 发表于 01-06 14:58 7169次阅读

    CPU的6个主要寄存器

    CPU寄存器是中央处理内的组成部分,是有限存贮容量的高速存贮部件。寄存器是CPU内部的元件,包括通用寄存器、专用
    的头像 发表于 02-03 15:15 4272次阅读

    寄存器分为基本寄存器和什么两种

    寄存器是计算机中用于存储数据的高速存储单元,它们是CPU内部的重要组成部分。寄存器可以分为基本寄存器和扩展寄存器两种类型。 一、基本
    的头像 发表于 07-12 10:31 1344次阅读