異常(Exceptions)
當正常的程式執流程發生暫時的停止時,稱之為異常。
處理插斷要求,處理前保留現場以便處理完後返回;
處理器允許多個異常同時發生,它們會按固定的優先順序被處理。
ARM體繫結構所支援的異常類型及其具體含義(按優先順序從高到低):
<!--[if !supportLists]-->1. <!--[endif]-->複位:當處理器複位電平有效時產生複位異常;
<!--[if !supportLists]-->2. <!--[endif]-->資料中止:當處理器指令訪問的資料地址不存在或不允許該指令訪問時;
<!--[if !supportLists]-->3. <!--[endif]-->FIQ:當處理器的快速插斷要求引腳有效且CPSR中F位為0(為1時禁止FIQ)時;
<!--[if !supportLists]-->4. <!--[endif]-->RIQ:當處理器的外部插斷要求引腳有效且CPSR中I位為0時;
<!--[if !supportLists]-->5. <!--[endif]-->預取中止:當處理器預取指令的地址不存在或該地址不允許當前指令訪問時;
<!--[if !supportLists]-->6. <!--[endif]-->未定義指令,SWI:當ARM處理器或副處理器遇到不能處理的指令時;
<!--[if !supportLists]-->7. <!--[endif]-->軟體中斷。
對異常的響應
從異常返回
異常處理完後ARM處理器會執行以下兩個步驟從異常返回:
<!--[if !supportLists]-->1. <!--[endif]-->將SPSR複製到CPSR;
<!--[if !supportLists]-->2. <!--[endif]-->將串連寄存器LR的值減去相應的位移量後送到PC。
可以認為程式總是從複位例外處理常式開始執行的,因此複位例外處理常式不需要返回。
ARM儲存空間格式
ARM體繫結構將儲存空間看成是從0地址開始的位元組的線性組合;
ARM體繫結構可以用兩種格式儲存位元組資料,分別稱為大端格式(big-endian)和小端格式(little-endian)。分別如下表1和表2所示:
表1 bin-endian
31
24
23
16
15
8
7
0
字單元A(地址為A:包括地址為A、A+1、A+2、A+3的位元組單元)
半字單元A(地址為A)
半字單元A+2(地址為A+2)
位元組單元A(地址為A)
位元組單元A+1
位元組單元A+2
位元組單元A+3
表2 little-endian
31
24
23
16
15
8
7
0
字單元A(地址為A:包括地址為A、A+1、A+2、A+3的位元組單元)
半字單元A+2(地址為A+2)
半字單元A (地址為A)
位元組單元A+3
位元組單元A+2
位元組單元A+1
位元組單元A