1. 程式人生 > >ARM 程式狀態暫存器深入分析

ARM 程式狀態暫存器深入分析

程式狀態暫存器共分為兩種,它們的位數都是 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 的值:
  • 加法運算(包括比較指令 CNM):C=1:運算結果產生了進位時(無符號數溢位)。C=0:運算結果沒有進位
  • 減法運算(包括比較指令 CMP):C=0:運算時產生了借位(無符號數溢位)。C=1:沒有借位
  • 對於包含移位操作的非加 / 減法運算指令,C 為移出值的最後一位
  • 對於其他的非加 / 減法 運算指令,C 的值通常不變
V 可以有兩種方法設定 V 的值:
  • 對於加 / 減法運算指令,當運算元和運算結果為二進位制的補碼錶示的有符號數時,V=1 表示符號位溢位
  • 對於其他的非加 / 減法 運算指令,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= D 7 D 6... D 1 D 0 \overline{D7\lor D6...D1\lor D0}
  • V= C 6 C 7 C6\oplus C7 (兩個進位進行亦或)

更多解釋:
C 用來判斷無符號數計算是否溢位。
V 用來判斷有符號數計算是否溢位 。
具體看哪個根據你計算時把資料當成有符號位還是無符號位。

控制位代表啥含義不是我撰寫的本文重點,故此不提。