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

    文章

    18275

    浏览量

    222158
  • ARM
    ARM
    +关注

    关注

    134

    文章

    8651

    浏览量

    361780
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117721
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41023
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79541

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

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

收藏 人收藏

    评论

    相关推荐

    解析CPU中的寄存器

    8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
    发表于 09-19 10:10 2901次阅读

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

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

    详解CPSR状态寄存器

    汇编三 — CPSR 状态寄存器
    发表于 04-18 07:24

    寄存器与移位寄存器

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

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

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

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

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

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

    32位寄存器,32位寄存器是什么意思  从X8086开始学了一年,第一个ASM的程序就是变32换16进制的程序,不过现在叫我从新开始写ASM程
    发表于 03-08 17:26 1.7w次阅读

    寄存器与移位寄存器

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

    浅谈ARM寄存器组织

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

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

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

    寄存器由什么组成

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

    FPGA之软核演练篇:影子寄存器

    就同用户模式下的R13不同,虽然它们编码一样,但是实际上对应的是不同的物理寄存器(可以将CPSR的模式域当作片选)。
    的头像 发表于 12-09 07:03 1509次阅读
    FPGA之软核演练篇:影子<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>

    Linux程序状态寄存器访问指令

    CPSR或SPSR) MRS R 0 ,CPSR ;传送CPSR的内容到R 0 MRS R 0 ,SPSR ;传送SPSR的内容到R 0 2、【MSR指令】 MSR 程序状态寄存器
    的头像 发表于 10-07 14:22 563次阅读

    CPU的6个主要寄存器

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