0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

嵌入式那些事 ? 來源: 嵌入式那些事 ? 2023-10-20 11:38 ? 次閱讀

程序狀態(tài)寄存器的作用就是反映處理器的狀態(tài)信息。在程序運(yùn)行期間我們可以通過查看程序狀態(tài)寄存器的狀態(tài)位來進(jìn)行程序的分支跳轉(zhuǎn)處理,或者我們可以設(shè)置程序狀態(tài)寄存器的模式位來改變處理器的運(yùn)行模式,或者我們可以設(shè)置程序狀態(tài)寄存器的中斷屏蔽位來屏蔽中斷。

在任何時(shí)刻,我們可以訪問處理器的16個(gè)寄存器(R0~R15)和當(dāng)前程序狀態(tài)寄存器(Current Program Status Register,CPSR)。用戶模式下的程序訪問的程序狀態(tài)寄存器叫做APSR(Application Program Status Register),APSR是CPSR在用戶模式下的別名,因?yàn)樵谟脩裟J较翪PSR的部分域是不能操作的,因此CPSR的部分域被屏蔽后就是APSR。

CPSR寄存器組成

在所有模式下均可以訪問到CPSR,只是在用戶模式下CPSR的部分域是不能操作的,當(dāng)前程序狀態(tài)寄存器(CPSR)的位組成如下圖所示:

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

Snipaste_2023-09-08_20-34-48

各個(gè)位域的說明如下:

標(biāo)志 說明
31 N 當(dāng)運(yùn)算結(jié)果為負(fù)且運(yùn)算指令要求更新寄存器時(shí),該位會(huì)被置位。
30 Z 當(dāng)運(yùn)算結(jié)果為0且運(yùn)算指令要求更新寄存器時(shí),該位會(huì)被置位。
29 C 當(dāng)運(yùn)算結(jié)果產(chǎn)生進(jìn)位且指令要求更新寄存器時(shí),該位會(huì)被置位。
28 V 當(dāng)運(yùn)算結(jié)果產(chǎn)生符號(hào)位溢出且指令要求更新寄存器時(shí),該位會(huì)被置位。
27 Q cumulative saturation。
26:25 IT[1:0] IT位,由IT[7:2]和IT[1:0]組成,Thumb指令集中IT指令的If-Then執(zhí)行狀態(tài)。
24 J 指示ARM是否處于Jazelle狀態(tài)。
19:16 GE[3:0] 被一些SIMD(Single Instruction Multiple Data)指令使用。
15:10 IT[7:2] 見IT[1:0]的描述。
9 E 指示處理器的大小端模式,同時(shí)可以通過設(shè)置該位來修改處理器的大小端模式,1表示大端模式,0表示小端模式。
8 A 是否屏蔽異步終止,該位為1時(shí)表示屏蔽異步終止,為0時(shí)表示打開異步終止。
7 I 是否屏蔽IRQ,該位為1時(shí)表示屏蔽IRQ,為0時(shí)表示打開IRQ。
6 F 是否屏蔽FIQ,該位為1時(shí)表示屏蔽FIQ,為0時(shí)表示打開FIQ。
5 T 指示ARM是否處于Thumb狀態(tài)。J和T標(biāo)志共同決定處理器使用的指令集。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] 指示處理器的模式,同時(shí)可以通過設(shè)置該位域來修改處理器的模式。

處理器各個(gè)模式的編碼如下圖所示:

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

Snipaste_2023-09-01_20-59-03

APSR寄存器組成

在用戶模式下,用戶程序能夠操作的CPSR寄存器位域是有限制的,對(duì)CPSR寄存器的部分位域屏蔽之后就是APSR了,應(yīng)用程序狀態(tài)寄存器(APSR)的位組成如下圖所示:

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

Snipaste_2023-09-11_20-03-04

從上圖可以看出,APSR只能訪問N,Z,C,V,Q和GE[3:0]這些標(biāo)志位,這些標(biāo)志位的含義和CPSR中對(duì)應(yīng)標(biāo)志位的含義一樣。

SPSR

備份程序狀態(tài)寄存器(Saved Program Status Register,SPSR)主要用于存儲(chǔ)前一個(gè)執(zhí)行模式的CPSR。FIQ、IRQ、ABT、SVC和UND模式,都有他們自己模式下專用的SPSR。在處理器發(fā)生中斷或者異常時(shí),處理器會(huì)自動(dòng)的從一個(gè)模式A進(jìn)入到另一個(gè)模式B,模式A的CPSR/APSR將會(huì)自動(dòng)保存到模式B的SPSR中,這樣模式B中的處理程序能夠通過訪問SPSR寄存器得到模式A下CPSR寄存器的信息。

程序狀態(tài)寄存器操作指令

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指令可用于讀寫程序狀態(tài)寄存器CPSR,APSR和SPSR。

在ARM處理器中,只有MRS指令可以從程序狀態(tài)寄存器CPSR,APSR和SPSR中讀出數(shù)據(jù)到通用寄存器中。MRS指令操作程序狀態(tài)寄存器的語法如下:

MRS{cond} Rd, psr

cond為條件碼。

Rd為目標(biāo)寄存器,Rd不允許為R15。

psr為程序狀態(tài)寄存器CPSR,APSR或者SPSR。

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

# 將CPSR寄存器的值讀取到R0中
MRS R0, CPSR

# 將SPSR寄存器的值讀取到R1中
MRS R1, SPSR

# 將APSR寄存器的值讀取到R2中
MRS R2, APSR

MSR指令可以用來寫程序狀態(tài)寄存器CPSR,APSR和SPSR的全部或者部分域。MSR指令操作程序狀態(tài)寄存器的語法如下:

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

cond為條件碼。

psr為程序狀態(tài)寄存器CPSR或者SPSR。

constant是一個(gè)8位立即數(shù)。ARM文檔對(duì)于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由下面的一個(gè)或者多個(gè)組合而成:

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

x:xPSR[15:8],擴(kuò)展位域;

s:xPSR[23:16],狀態(tài)位域;

f:xPSR[31:24],標(biāo)志位域;

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

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

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

只有在除用戶模式外的其他模式下才能夠修改狀態(tài)寄存器。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19032

    瀏覽量

    228442
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9005

    瀏覽量

    366020
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5268

    瀏覽量

    119640
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    893

    瀏覽量

    41319
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3742

    瀏覽量

    80661

原文標(biāo)題:ARMv7-A 那些事 - 3.程序狀態(tài)寄存器

文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    寄存器是什么?怎么操作寄存器點(diǎn)亮LED燈?

    寄存器,是集成電路中非常重要的一種存儲(chǔ)單元,通常由觸發(fā)組成。在集成電路設(shè)計(jì)中,寄存器可分為電路內(nèi)部使用的寄存器和充當(dāng)內(nèi)外部接口的
    的頭像 發(fā)表于 07-21 16:59 ?3724次閱讀
    <b class='flag-5'>寄存器</b>是什么?怎么操作<b class='flag-5'>寄存器</b>點(diǎn)亮LED燈?

    寄存器與移位寄存器

    寄存器與移位寄存器 寄存器是用來寄存數(shù)碼的邏輯部件,所以必須具備接收和寄存數(shù)碼的功能。任何一種觸發(fā)
    發(fā)表于 03-12 15:19 ?59次下載

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

    第二十六講 寄存器和移位寄存器7.4.1 寄存器1.定義2.電路舉例 3.邏輯功能分析7.4.2 移位寄存器一、單向移位寄存器㈠ 由4個(gè)維持
    發(fā)表于 03-30 16:30 ?9425次閱讀
    第二十六講 <b class='flag-5'>寄存器</b>和移位<b class='flag-5'>寄存器</b>

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

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內(nèi)的組成部分。
    發(fā)表于 03-08 14:26 ?2.2w次閱讀

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思 數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加AX、基址寄存器BX、計(jì)數(shù)
    發(fā)表于 03-08 14:38 ?1.2w次閱讀

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

    移位寄存器,移位寄存器是什么意思 移位寄存器_
    發(fā)表于 03-08 14:50 ?1.7w次閱讀

    寄存器與移位寄存器

    寄存器與移位寄存器:介紹寄存器原理和移位寄存器的原理及實(shí)現(xiàn)。
    發(fā)表于 05-20 11:47 ?0次下載

    淺談ARM寄存器組織

    3.3 ARM寄存器組織 ARM處理有37個(gè)32位長的寄存器。 1個(gè)用作PC(Program Counter)。 1個(gè)用作CPSR(Current Program Status Re
    發(fā)表于 10-18 13:26 ?1次下載
    淺談ARM<b class='flag-5'>寄存器</b>組織

    dptr是什么寄存器_dptr由幾個(gè)寄存器組成

    dptrDPTR是一個(gè)16位的專用地址指針寄存器,由兩個(gè)獨(dú)立的8位寄存器組成。
    發(fā)表于 12-27 15:46 ?2.7w次閱讀

    寄存器由什么組成

    本文首先介紹了寄存器的原理組成,其次介紹了ARM寄存器組成,最后介紹了寄存器的用途。
    的頭像 發(fā)表于 08-21 18:33 ?3.7w次閱讀

    AD轉(zhuǎn)換寄存器設(shè)置

    AD轉(zhuǎn)換寄存器設(shè)置AD轉(zhuǎn)換寄存器設(shè)置AD轉(zhuǎn)換寄存器設(shè)置
    發(fā)表于 11-10 17:36 ?16次下載
    AD轉(zhuǎn)換<b class='flag-5'>寄存器</b>設(shè)置

    GPIO寄存器

    每組IO口有10個(gè)寄存器組成,如果芯片有GPIOA~GPIOI,9個(gè)組那么一共有90個(gè)寄存器如果配置一個(gè)IO口需要2個(gè)位,那么剛好32位寄存器配置一組IO口16個(gè)IO口如果配置一個(gè)IO
    發(fā)表于 12-08 17:06 ?5次下載
    GPIO<b class='flag-5'>寄存器</b>

    ARM通用寄存器及狀態(tài)寄存器詳解

    筆者來聊聊ARM通用寄存器以及狀態(tài)寄存器的認(rèn)識(shí)與理解。
    的頭像 發(fā)表于 01-06 14:58 ?6682次閱讀

    CPU的6個(gè)主要寄存器

    CPU寄存器是中央處理內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用
    的頭像 發(fā)表于 02-03 15:15 ?3280次閱讀

    寄存器分為基本寄存器和什么兩種

    寄存器是計(jì)算機(jī)中用于存儲(chǔ)數(shù)據(jù)的高速存儲(chǔ)單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴(kuò)展寄存器兩種類型。 一、基本
    的頭像 發(fā)表于 07-12 10:31 ?826次閱讀