對cpsr的操作是采用“讀取-修改-寫入”的方式。即先用mrs讀出,再修改,最后用msr寫入cpsr。注意上面寫入時用的是cpsr_cxsf,下劃線_后面的表示的是“域”的意思,用于設定cpsr中需要操作的位。
c - control field mask byte (PSR[7:0]) 控制位域
x - extension field mask byte (PSR[15:8])
s - status field mask byte (PSR[23:16)
f - flags field mask byte (PSR[31:24]).
比如 msr cpsr_c, r1 表示只修改控制位,即cpsr的低8位。具體的可查看cpsr各位的定義。
12. 異常服務的響應過程
出現一個異常,arm處理器會執行以下幾個步驟:
A. 將下一條指令存入相應的lr里,以便程序從異常返回時能從正確的位置開始。
B. 將cpsr復制到相應的spsr。
C. 強制設置cpsr的運行模式位
D. 強制從異常向量地址取得下一條指令
Ok,經過以上步驟,就進入了異常里。以上步驟都是處理器自動執行的,不需要軟件干涉。從上面的D步驟起,我們在向量地址上放置跳轉指令,那么程序就可以跳到相關的處理程序里了。
我們順著書上的例子走一遍吧。
(1)FIQ
A. 產生FIQ中斷時,cpu自動跳到0x0000001c這個地址去執行代碼。還記得中斷向量表吧,里面這個地址的指令是 b
HandlerFIQ 。即要跳入HandlerFIQ 里了。
B. HandlerFIQ在哪里呢?
程序里有一段宏定義如下