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操作:
-
执行结果不可预知
-
忽略字单元地址的低两位的值;忽略半字单元地址的最低位的值
-
忽略字单元地址值中的低两位的值;忽略半字单元地址的最低位的值