對cpsr的操作是采用“讀取-修改-寫(xiě)入”的方式。即先用mrs讀出,再修改,最后用msr寫(xiě)入cpsr。注意上面寫(xiě)入時(shí)用的是cpsr_cxsf,下劃線(xiàn)_后面的表示的是“域”的意思,用于設定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. 異常服務(wù)的響應過(guò)程
出現一個(gè)異常,arm處理器會(huì )執行以下幾個(gè)步驟:
A. 將下一條指令存入相應的lr里,以便程序從異常返回時(shí)能從正確的位置開(kāi)始。
B. 將cpsr復制到相應的spsr。
C. 強制設置cpsr的運行模式位
D. 強制從異常向量地址取得下一條指令
Ok,經(jīng)過(guò)以上步驟,就進(jìn)入了異常里。以上步驟都是處理器自動(dòng)執行的,不需要軟件干涉。從上面的D步驟起,我們在向量地址上放置跳轉指令,那么程序就可以跳到相關(guān)的處理程序里了。
我們順著(zhù)書(shū)上的例子走一遍吧。
(1)FIQ
A. 產(chǎn)生FIQ中斷時(shí),cpu自動(dòng)跳到0x0000001c這個(gè)地址去執行代碼。還記得中斷向量表吧,里面這個(gè)地址的指令是 b
HandlerFIQ 。即要跳入HandlerFIQ 里了。
B. HandlerFIQ在哪里呢?
程序里有一段宏定義如下