7种工作模式:
1.User 用户模式 正常程序执行
2.FIQ 快速中断模式 高优先级中断
3.IRQ 外部中断模式 通常中断处理
4.Surpervisor 管理模式 复位或软中断
5.Abort 中止模式 存取异常
6.Undefined 未定义模式 执行未定义指令
7.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 |
Thumb状态和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中的大端小端格式:
大端格式中,字数据的高字节存储在低地址,低字节存储在高地址
小端格式中,字数据的低字节存储在低地址, 高字节存储在高地址