在ARM處理器中一條指令的執行分為取指、解碼、執行三個階段,由於指令流水線的存在造成當前執行的指令的地址是PC-8(ARM指令集),那么當前執行指令的下一條指令的地址應該是PC-4,所以在異常產生時處理器會將PC-4的值保存到對應模式的LR暫存器中,但是該返回地址是否能夠被使用還要看具體產生的異常的種類而定。
基本介紹
- 中文名:異常返回地址
- 外文名:Exception return address
異常的分類
異常類型 | 具體含義 |
復位(Reset) | 處理器的復位電平有效時,產生復位異常 |
未定義指令(Undefined) | 當ARM處理器或協處器遇到不能處理的指令時,產生未定義的指令異常,可使用該異常進行軟體仿真 |
軟體中斷(SWI) | 該異常由執行SWⅥ指令產生,可用於用戶模式下的程式調用特權操作指令。可使用該異常機制實現系統功能調用 |
指令預取中止(Prefetch Abort) | 處理器試圖去執行一條被標記為預取無效的指令時,將產生指令預取中止異常 |
數據中止(Data Abort) | 它由 Load/Store產生,若處理器數據訪問指令的地址不存在,或者是地址不允許當前指令訪問時,產生數據中止異常 |
外部中斷請求(IRQ) | 當處理器的外部部中斷請求引有效,且CPSR中的I位為0時,產生IRQ異常。系統的外設可通過該異常請求中斷服務 |
快速中斷請求(FIQ) | 當處理器的快遠中斷請求引有效,且CPSR中的F位為0時,產生FIQ異常 |
幾種類型詳述
復位異常(Reset)
FIQ與IRQ異常
FIQ與RIQ異常返回處理是一樣的,當處理器執行完當前指令後才去查詢中斷且查看是否允許中斷,如果處理器產生了中斷,這時PC的值已經更新,即PC指向了當前指令後第三條指令的位置(被中斷指令地址加12),產生FIQ與RIQ異常後處理器將P***的值保存到了對應模式下的LR,而它指向的是當前被中斷指令的後面的第二條指令,因此在返回時我們需要人為的將LR中保存的值自減4以得到正確的返回地址。
預取指中止異常(Prefetch Abort)
在指令預取時如果地址是非法的,該指令就被標記為有問題的指令,流水線上該指令之前的指令繼續執行,當執行被標記為有問題的指令的時候,處理器就會產生異常。產生該異常最終返回時需要返回到被標記的指令處重新讀取並執行該指令,因此異常返回時需要返回到該指令處而不是該指令的下一條指令。所以在中斷返回時我們需要人為的對LR中保存的值自減4。
指令未定義異常(Undefined)
指令未定義異常由當前正在執行的指令產生,即產生異常時PC的值還沒有更新,PC的值指向當前指令後面第二條指令,產生異常後LR中保存的指令是當前指令的下一條指令的地址,所以異常返回時直接把LR的值給PC即可不許人為的去修正返回地址。
軟中斷異常(SWI)
軟中斷異常與指令未定義異常一樣,也是當前指令在執行過程中就產生了異常,所以LR中保存的返回地址是當前軟中斷指令的下一條指令的地址,不需要人為的去修正,返回時直接將LR的值賦給PC即可。
數據中止異常(Data Abort)
產生該異常的時候程式要返回到有問題的指令處重新訪問該數據,因此應該返回到產生異常的指令處而不是產生異常指令的下一條指令處。當異常產生時PC的值已經更新,所以PC指向的是異常產生指令的後面的第三條指令,而LR中保存的是P***的值即異常產生指令的後面的第二條指令的地址。所以在返回時我們需人為的對LR中的值進行自減8的處理。以保證異常正確的返回。
上述每一種異常發生時,返回地址都要根據具體的異常類型進行重新修正。