1. ARM概述與基本編程模型
1.4 ARM處理器模式
-
用戶模式(User, usr)
-
快速中斷模式(FIQ, fig)
-
外部中斷模式(IRQ, irq)
-
特權模式(Supervisor, sve)
-
數據訪問中止模式(Abort, abt)
-
未定義指令中止模式(Undefined, und)
-
系統模式(System, sys)
用戶模式外的其他6種處理器模式稱為特權模式。這其中,除系統模式外,其他5種模式外,其他5種特權模式稱為異常模式。
1.5 ARM寄存器
ARM處理器共有37個寄存器,包括:
-
31個通用寄存器,包括程序計數器(PC)在內。都是32位
-
6個狀態寄存器。32位,只是用其中12位
ARM處理器共有7種不同的處理器模式,每種模式有一組相應的寄存器組。
任意時刻,可見的寄存器包括15個通用寄存器(R0~R14)、一個或兩個狀態寄存器及程序計數器(PC)。
1.5.1 通用寄存器
分為3類:
-
未備份寄存器,包括R0~R7
-
備份寄存器,包括R8~R14
-
程序計數器PC,即R15
1.5.2 程序狀態寄存器
CPSR(當前程序狀態寄存器):可以在任何處理器模式下被訪問,包含條件標志位、中斷禁止位,當前處理器模式標志以及其他的一些控制和狀態位。
SPSR(備份程序狀態寄存器):當特定的異常中斷發生時,這個寄存器用來存放當前寄存器的內容。在異常中斷程序退出時,可以用SPSR中保存到值恢復CPSR。
由於用戶模式和系統模式不是異常中斷模式,所以他們沒有SPSR。當在用戶模式和系統模式訪問SPSR,將會產生不可預知的結果
31 | 30 | 29 | 28 | 27 | 26 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
N | Z | C | V | Q | DNM(RAZ) | I | F | T | M4 | M3 | M2 | M1 | M0 |
N:=1表示負數
Z:=1結果為0
C:上下溢出
V:符號位溢出
I、F、T及M[4:0]:控制位,I、F為中斷禁止位,IRQ、FIQ。T說明本指令是ARM指令(0)還是Thumb指令(1)。M控制處理器模式。
1.6 ARM體系的異常中斷
執行流程的控制:
-
順序執行
-
跳轉指令
-
中斷發生
1.6.1 ARM中異常中斷種類
異常中斷名稱 | 含義 |
---|---|
復位(Reset) | 當處理器復位引腳有效,產生復位中斷,程序跳轉到復位異常中斷處理程序處執行。系統加電、系統復位、跳轉到復位中斷向量處執行(軟復位) |
未定義的指令(undefine instruction) | 處理器或協處理器認為當前指令未定義 |
軟件中斷(SWI) | 用戶模式下的程序調用特權操作指令 |
指令預取中止(prefech abort) | 預取的指令的地址不存在 |
數據訪問中止(Data Abort) | 數據訪問指令的目標地址不存在 |
外部中斷請求(IRQ) | 處理器的外部中斷請求引腳有效 |
快速中斷請求(FIQ) | 處理器的外部快速中斷請求引腳有效 |
1.6.2 ARM處理器對異常中斷的響應過程
-
保存處理器當前狀態、中斷屏蔽位以及條件標志位
-
設置當前程序狀態寄存器CPSR中相應的位
-
將寄存器lr_mode設置成返回地址
-
將程序計數器值(PC),設置成該異常中斷的中斷向量地址,從而跳轉到相應的異常中斷處理程序執行處執行。
R14_ = return link ;設置返回地址
SPSR_ = CPSR ;保存狀態寄存器
CPSR[4:0] = exception mode number ;設置執行模式
CPSR[5] = 0 ;運行於ARM模式
if == Reset or FIQ then
CPSR[6] = 1 ;禁止新的FIQ中斷
CPSR[7] = 1 ;禁止IRQ中斷
PC = exception vector address
1.6.3 從異常中斷處理程序中返回
-
恢復被中斷的程序的處理器狀態,即將SPSR_mode寄存器內容復制到CPSR中
-
返回到發生異常中斷的指令的下一條指令處執行,即將lr_mode寄存器的內容復制到程序計數器PC中。
復位異常中斷處理程序不需要返回,在復位異常中斷處理程序開始整個用戶程序的執行,因而它不需要返回
1.7 ARM體系中的存儲系統
1.7.1 ARM體系中的存儲空間
1.7.2 ARM存儲器的格式
-
big-endian
-
little-endian
1.7.3 非對齊的存儲訪問操作
-
非對齊的指令預取操作
指令的執行結果不可預知,要么地址值中最低位被忽略
-
非對齊的數據訪問操作
對於Load/Store操作:
-
執行結果不可預知
-
忽略字單元地址的低兩位的值;忽略半字單元地址的最低位的值
-
忽略字單元地址值中的低兩位的值;忽略半字單元地址的最低位的值