ARM7 響應異常處理時的斷點返回地址計算
ARM處理器對異常的響應過程可用虛擬碼描述如下:
R14_<exception_mode>=return link
SPSR_<exception_mode>=CPSR
CPSR[4:0]=exception mode number
CPSR[5]=0 /* 當運行於ARM狀態時 */
if <exception_mode> == Reset or FIQ then
CPSR[6]=1 /* 禁止新的FIQ中斷 */
CPSR[7]=1 /* 禁止新的IRQ中斷 */
PC = exception vector address
注意:異常發生時異常模式R14的定義是PC-4。
IRQ、FIQ和ABT(指令預取)異常中斷處理程式的返回
發生IRQ或者FIQ異常中斷時,指令已經執行完畢,PC指向當前指令後面的第3條指令。因此IRQ或者FIQ的異常中斷髮生時,處理器將程式計數器的計算值(PC-4)儲存到LR_IRQ或者LR_FIQ暫存器中。這時LR_IRQ或者LR_FIQ暫存器的值指向當前指令後的第2條指令。
在指令預取時如果目標地址是非法的,該指令將被標記成有問題的指令,處理器產生指令預取ABT異常。此刻PC的值還沒有更新,它指向當前指令後的第2條指令。指令預取ABT異常中斷髮生時,處理器將程式計數器的計算值(PC-4)儲存到異常模式LR_ABT。這時LR_ABT暫存器的值指向當前指令後的第1條指令。
當IRQ、FIQ和ABT(指令預取)異常中斷處理程式退出時,前兩種情況下應該執行斷點的下一條指令,後一種情況下程式應該返回到有問題的指令處(即斷點指令),重新讀取並執行。無論上述三種情況的那一種,返回操作都應該通過SUBS PC, LR, #4指令實現。該指令將暫存器LR中的值複製到程式計數器PC中,實現程式返回,同時將SPSR_SVC或者SPSR_UND暫存器的內容複製到CPSR中。