ARM相关
7种工作模式:
User 用户模式 正常程序执行
FIQ 快速中断模式 高优先级中断
IRQ 外部中断模式 通常中断处理
Surpervisor 管理模式 复位或软中断
Abort 中止模式 存取异常
Undefined 未定义模式 执行未定义指令
System 系统模式 特权级的
寄存器:
ARM有37个寄存器:31个32位通用寄存器,6个状态寄存器(只用12位)。
未分组寄存器R0~R7 是真正的通用寄存器
分组寄存器R8~R14 使用FIQ模式时,访问R8_fiq~R12_fiq
寄存器R13在ARM指令中常用作堆栈指针SP,这是一种习惯用法
R14 作为子程序连接寄存器 当BL指令执行时,R14中得到R15(程序计数器)的备份 其他情况作通用寄存器
R15 程序计数器 ARM状态下:位[1:0]为0,位[31:2]用于保存PC,在Thumb状态下,位[0]为0,位[31:1]用于保存PC
PC总指向正在取指的指令,也就是当前指令的下两条指令的地址,
对于ARM状态,指向当前指令地址值加8个字节的地址
对于Thumb状态,指向当前指令地址值加4个字节的地址
CPSR (Current Program Status Register)
M[4:0] 处理器模式选择
T 处理器工作状态选择,T=1,Thumb状态;T=0,ARM状态
I=1,禁止IRQ中断
F=1,禁止FIQ中断
N:判负标志
Z:判0标志
C:进位标志
V:溢出标志
M[4:0] 模式
10000 User
10001 FIQ
10010 IRQ
10011 Supervisor
10111 Abort
11011 Undefined
11111 System
humb状态和ARM状态下寄存器的映射
Thumb ARM
R0~R7 R0~R7
CPSR CPSR
SPSR SPSR
SP R13
LR R14
PC R15
异常:
进入异常行为:
1.将下一条指令的地址保存到相应的Link寄存器中(R14),如果是ARM状态进入异常,根据异常状态,数值为当前PC+4或PC+8
2.拷贝CPSR到相应的SPSR
3.根据异常类型强制改变CPSR模式位的值,禁止IRQ,禁止FIQ(这两个在需要时才禁止)
4.令PC的值指向异常处理向量所指的下一指令(执行中断处理程序)
异常返回行为:
1.将Link寄存器减去相应的偏移量,赋给PC
2.拷贝回SPSR到CPSR
3.清除中断禁止标志
每个异常模式对应有两个寄存器R13保存堆栈指针,R14保存返回地址
异常响应过程:
R14_<mode>=return link //保存返回地址
SPSR_<mode>=CPSR //拷贝CPSR
CPSR[4:0]=mode number //改变模式
CPSR[5]=0 //运行于ARM状态
CPSR[6]=1 //禁止IRQ中断
if <mode>=Reset or FIQ then //当Reset或FIQ异常中断时
CPSR[7]=1 //禁止FIQ中断
PC=exception vector address //PC转到中断向量地址
异常中断向量:
地址 异常 进入模式
0x0000 0000 复位 管理模式
0x0000 0004 未定义指令 未定义模式
0x0000 0008 软件中断 管理模式
0x0000 000C 预取指中止 中止模式
0x0000 0010 数据中止 中止模式
0x0000 0014 保留 保留
0x0000 0018 IRQ IRQ
0x0000 001C FIQ FIQ
ARM中断优先级:
优先级 异常
1 复位
2 数据中止
3 FIQ
4 IRQ
5 预取指中止
6 未定义指令,SWI
ARM中的大端,小端格式
大端格式中,字数据的高字节存储在低地址,低字节存储在高地址