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