程序狀態(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)的位組成如下圖所示:
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è)模式的編碼如下圖所示:
Snipaste_2023-09-01_20-59-03
APSR寄存器組成
在用戶模式下,用戶程序能夠操作的CPSR寄存器位域是有限制的,對(duì)CPSR寄存器的部分位域屏蔽之后就是APSR了,應(yīng)用程序狀態(tài)寄存器(APSR)的位組成如下圖所示:
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)寄存器。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19407瀏覽量
231175 -
ARM
+關(guān)注
關(guān)注
134文章
9165瀏覽量
369170 -
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
121155 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41746 -
程序
+關(guān)注
關(guān)注
117文章
3795瀏覽量
81405
原文標(biāo)題:ARMv7-A 那些事 - 3.程序狀態(tài)寄存器
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
寄存器是什么?怎么操作寄存器點(diǎn)亮LED燈?
![<b class='flag-5'>寄存器</b>是什么?怎么操作<b class='flag-5'>寄存器</b>點(diǎn)亮LED燈?](https://file1.elecfans.com/web2/M00/8D/6E/wKgaomS6SMiADtQfAACtrdEXQEk745.jpg)
寄存器與移位寄存器
第二十六講 寄存器和移位寄存器
![第二十六講 <b class='flag-5'>寄存器</b>和移位<b class='flag-5'>寄存器</b>](https://file1.elecfans.com//web2/M00/A4/AE/wKgZomUMNUKABx0eAAAhi-Hi3Ts894.gif)
數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思
淺談ARM寄存器組織
![淺談ARM<b class='flag-5'>寄存器</b>組織](https://file.elecfans.com/web2/M00/4A/10/pYYBAGKhvJGAcLdmAAAS-Jc1348145.png)
dptr是什么寄存器_dptr由幾個(gè)寄存器組成
AD轉(zhuǎn)換寄存器設(shè)置
![AD轉(zhuǎn)換<b class='flag-5'>寄存器</b>設(shè)置](https://file.elecfans.com/web1/M00/CE/C1/o4YBAF-qXxiAQZdBAAFZb1Kjs8s041.png)
GPIO寄存器
![GPIO<b class='flag-5'>寄存器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論