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

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

3天內不再提示

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

嵌入式那些事 ? 來(lái)源: 嵌入式那些事 ? 2023-10-20 11:38 ? 次閱讀

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

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

CPSR寄存器組成

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

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

Snipaste_2023-09-08_20-34-48

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

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

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

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

Snipaste_2023-09-01_20-59-03

APSR寄存器組成

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

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

Snipaste_2023-09-11_20-03-04

從上圖可以看出,APSR只能訪(fǎng)問(wèn)N,Z,C,V,Q和GE[3:0]這些標志位,這些標志位的含義和CPSR中對應標志位的含義一樣。

SPSR

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

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

CPS指令

可以通過(guò)CPS(Change Processor State)指令來(lái)修改處理器模式。CPS指令也可以用來(lái)使能或者禁止異常。

CPS指令的語(yǔ)法如下所示:

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

mode是處理器的模式編碼,比如在從其他模式下切換到SYS模式,使用下述代碼即可:

# 切換到SYS模式
CPS #0x1f

IE使能中斷或者終止。

ID禁止中斷或者終止。

iflags由下面的一種或者幾種組成:

a:表示異步終止(asynchronous abort);

i:表示中斷(IRQ);

f:表示快中斷(FIQ);

下述代碼是CPS指令的一些簡(jiǎn)單用法:

# 使能中斷
CPSIE I

# 禁止中斷
CPSID I

# 使能異步終止和快中斷
CPSIE AF

# 禁止異步終止和快中斷
CPSID AF

# 使能中斷并切換到SYS模式
CPSIE I, #0x1f

MRS與MSR指令

MRS和MSR指令可用于讀寫(xiě)程序狀態(tài)寄存器CPSR,APSR和SPSR。

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

MRS{cond} Rd, psr

cond為條件碼。

Rd為目標寄存器,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指令可以用來(lái)寫(xiě)程序狀態(tài)寄存器CPSR,APSR和SPSR的全部或者部分域。MSR指令操作程序狀態(tài)寄存器的語(yǔ)法如下:

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位立即數。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由下面的一個(gè)或者多個(gè)組合而成:

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    68

    文章

    18564

    瀏覽量

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

    關(guān)注

    134

    文章

    8726

    瀏覽量

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

    關(guān)注

    30

    文章

    5167

    瀏覽量

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

    關(guān)注

    5

    文章

    885

    瀏覽量

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

    關(guān)注

    114

    文章

    3651

    瀏覽量

    79786

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    解析CPU中的寄存器

    8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
    發(fā)表于 09-19 10:10 ?3128次閱讀

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

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

    詳解CPSR狀態(tài)寄存器

    匯編三 — CPSR 狀態(tài)寄存器
    發(fā)表于 04-18 07:24

    寄存器與移位寄存器

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

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

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

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

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

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

    32位寄存器,32位寄存器是什么意思  從X8086開(kāi)始學(xué)了一年,第一個(gè)ASM的程序就是變32換16進(jìn)制的程序,不過(guò)現在叫我從新開(kāi)始寫(xiě)ASM程
    發(fā)表于 03-08 17:26 ?1.7w次閱讀

    寄存器與移位寄存器

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

    淺談ARM寄存器組織

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

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

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

    寄存器由什么組成

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

    FPGA之軟核演練篇:影子寄存器

    就同用戶(hù)模式下的R13不同,雖然它們編碼一樣,但是實(shí)際上對應的是不同的物理寄存器(可以將CPSR的模式域當作片選)。
    的頭像 發(fā)表于 12-09 07:03 ?1564次閱讀
    FPGA之軟核演練篇:影子<b class='flag-5'>寄存器</b>組

    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>

    Linux程序狀態(tài)寄存器訪(fǎng)問(wèn)指令

    CPSR或SPSR) MRS R 0 ,CPSR ;傳送CPSR的內容到R 0 MRS R 0 ,SPSR ;傳送SPSR的內容到R 0 2、【MSR指令】 MSR 程序狀態(tài)寄存器
    的頭像 發(fā)表于 10-07 14:22 ?664次閱讀

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

    CPU寄存器是中央處理器內的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內部的元件,包括通用寄存器、專(zhuān)用寄存器和控制
    的頭像 發(fā)表于 02-03 15:15 ?1649次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看