程序狀態(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寄存器位域是有限制的,對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中對應(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文檔對于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文章
19286瀏覽量
229833 -
ARM
+關(guān)注
關(guān)注
134文章
9097瀏覽量
367552 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120361 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41497 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81043
原文標(biāo)題:ARMv7-A 那些事 - 3.程序狀態(tài)寄存器
文章出處:【微信號(hào):嵌入式那些事,微信公眾號(hào):嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論