ARM 程式狀態暫存器深入分析
阿新 • • 發佈:2018-11-12
程式狀態暫存器共分為兩種,它們的位數都是 32 位:
- 1 個 CPSR:當前程式狀態暫存器(current program status register),可以在任何工作模式下被訪問。
- 5 個 SPSR:保持程式狀態暫存器(saved program status register),只有在異常模式下,才能被訪問;各異常模式擁有自己的 SPSR。發生異常時,SPSR 儲存 CPSR 的值,格式同 CPSR。
它們 32 位的含義分別如下:
- 條件碼標誌( The condition code flags):5 個。N 符號標誌,Z 零標誌,C 進位標誌,V 溢位標誌,Q DSP運算溢位標誌。
- 控制位(The control bits):4個。I IRQ標誌,F FIQ標誌,T 狀態位,M[4:0] 模式位。
圖中的 DNM 是 Do Not Modify,表示不同版本、處理器的含義不同。
此圖來自 https://blog.csdn.net/u014132720/article/details/52088485。不知道他看的哪本英文書,我看的沒他這個詳細,因此拿來一用。
條件碼的具體含義:
標誌位 | 含義 |
---|---|
N | 當用兩個補碼錶示的帶符號數進行運算時。 N=1:運算結果為負數 。 N=0:運算結果為正數或零 |
Z | Z=1:運算結果為0。 Z=0:運算結果不為0 |
C | 可以有四種方法設定 C 的值:
|
V | 可以有兩種方法設定 V 的值:
|
Q | 在 ARM v5 及以上版本的 E 系列處理器中,用 Q 標誌位指示增強的 DSP 運算指令是否發生了溢位。在其它版本的處理器中,Q 標誌位無定義。 |
至於這些值都是怎麼得來的呢?看下面的講解:
首先我們有上面這幅圖,其中 D7-D0 代表資料位,共一個位元組。其上的 C7-C0 則代表向前進位的值。
因此我們可以用 D7-D0 和 C7-C0 來表示條件碼 N, Z, C, V:
- N=D7
- C=C7
- Z=
- V= (兩個進位進行亦或)
更多解釋:
C 用來判斷無符號數計算是否溢位。
V 用來判斷有符號數計算是否溢位 。
具體看哪個根據你計算時把資料當成有符號位還是無符號位。
控制位代表啥含義不是我撰寫的本文重點,故此不提。