ARM的暫存器及異常處理機制
arm的暫存器:
普通:r0-r15
r0-r12 //儲存任何資料
r13(sp) //棧指標暫存器(私有暫存器),當模式切換、程式跳轉時,可以儲存通用暫存器數值到sp指向的記憶體地址
r14(lr)//連結暫存器() 當程式跳轉時,用來記錄程式返回地址
r15(pc)//程式計數器 讀操作:arm狀態讀取得是當前正在執行的指令地址+8
寫操作:cpu會自動跳轉到寫入地址處執行程式碼
特殊:cpsr(程式當前狀態暫存器)
N 31位 1表示結果為負 0表示結果為正
Z 30位 1表示結果為0 0表示結果非0
C 29位 加法 1表示存在進位 0表示沒有進位 減法:1表示沒有借位 0表示有借位
V 28位 溢位表示:1結果溢位 0沒有溢位
運算表示位只能cpu根據運算結果自己修改,程式設計師不能寫
E 9位 0小端 1大端
I 7位 中斷控制位 1不接收中斷 0接收中斷
F 6位 快速中斷控制位 1不接收快速中斷 0接收快速中斷
M 4-0位 工作模式表示域
when '10000' result = usr; // User mode
when '10001' result = fiq; // FIQ mode
when '10010' result = irq; // IRQ mode
when '10011' result = svc; // Supervisor mode
when '10110' result = mon; // Monitor mode
when '10111' result = abt; // Abort mode
when '11010' result = hyp; // Hyp mode
when '11011' result = und; // Undefined mode
when '11111' result = usr; // System mode uses User mode registers
修改模式的方法:
1.在管理模式,程式設計師自主修改
2.在異常發生時,cpu自動修改
spsr(儲存的程式狀態暫存器)儲存存cpsr數值
arm的異常處理機制:
異常發生時,cpu會自動跳轉到異常向量表固定位置執行程式碼
異常向量表:arm的異常事件處理方法集合
異常向量表基地址:0x00000000 0xffff0000 armv7可以設定在任意位置
arm一共分7中異常
0x0 reset異常
0x4 Undefined Instruction(未定義)
0x8 Supervisor Call(svc異常,軟體中斷)
0xc Prefetch Abort (預取中止)
0x10 Data Abort (資料中止)
0x14 not used
0x18 irq
0x1c fiq
當程式執行發生異常時,會自動跳轉到異常向量表的固定位置處執行程式碼。