第2-1章 ARM编程模型
ARM处理器的工作状态
- ARM状态,此时处理器执行32位,字对齐的ARM指令
- Thumb状态,此时处理器执行16位,半字对齐的Thumb指令
bx指令可以切换两者状态
处理器模式
ARM处理器支持7种运行模式
处理器模式 | 描述 |
---|---|
用户模式(User, USR) | 正常的程序执行状态 |
快速中断模式(Fast Interrupt Request, FIQ) | 用于高速数据传输或通道处理 |
外部中断模式(Interrupt Request, IRQ) | 用于通用的中断处理 |
特权模式(Supervisor, SVC) | 操作系统使用的保护模式 |
中止模式(Abort, ABT) | 当数据或指令预取中止时进入该模式 |
未定义模式(Undefined, UND) | 当未定义的指令执行时进入该模式 |
系统模式(System, SYS) | 运行具有特权的操作系统任务 |
- 除用户模式以外,其余的所有6种模式称之为非用户模式,或特权模式
- FIQ、IRQ、SVC、ABT、UND这5种模式称为异常模式
- 系统模式仅在ARMv4及其以上版本中存在,该模式不能通过任何异常进入,且与用户模式有完全相同的寄存器,但不受用户模式的限制
寄存器组织
ARM处理器共有37个32位寄存器,其中包括1个用作PC、一个用作CPSR、5个用作SPSR和30个通用寄存器
程序状态寄存器
条件码标志
标志位 | 含义 |
---|---|
N | 当用两个补码表示的带符号数进行运算时: N=1表示运算的结果为负数 N=0表示运算的结果位正数或零 |
Z | Z=1表示运算的结果为零 Z=0表示运算的结果为非零 |
C | 加法运算(包括比较指令cmp):当运算结果产生了进位时(无符号溢出),C=1,否则C=0 减法运算(包括比较指令cmp):当运算产生借位时(无符号溢出),C=0,否则C=1 移位操作的非加/减运算指令,C为移出值的最后一位 其它的非加/减运算指令,C的值通常不改变 |
V | 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出 对于其它的非加/减法运算指令,V的值通常不改变 |
Q | 在ARMv5及以上版本的E系列处理器中,用Q标志位指示增强的DSP运算指令是否发生了溢出 其它版本的处理器种,Q标志位无定义 |
- 中断禁止位I、F:置1时禁止IRQ中断和FIQ中断
- T标志位:置1时为Thumb状态,置0时为ARM状态
- 运行模式位M[4:0]决定了处理器的运行模式
M[4:0] | 处理器模式 |
---|---|
10000 | 用户模式 |
10001 | FIQ模式 |
10010 | IRQ模式 |
10011 | 管理模式 |
10111 | 中止模式 |
11011 | 未定义模式 |
11111 | 系统模式 |
异常
ARM对异常的处理按以下步骤操作:
- 将下一条指令的地址存入相应连接寄存器LR
- 将CPSR复制到相应的SPSR
- 根据异常类型,强制设置CPSR的运行模式位
- 强制PC从相应的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处
异常处理完毕之后,执行以下几步操作从异常返回:
- 将连接寄存器LR的值减去相应的偏移量后送到PC中
- 将SPSR复制回CPSR中
- 若在进入异常处理时设置了中断禁止位,要在此清除
模式 | 返回指令 |
---|---|
FIQ | subs pc, r14_fiq, #4 |
IRQ | subs pc, r14_irq, #4 |
ABT | subs pc, r14_abt, #4 ;指令预取中止 subs pc, r14_abt, #8 ;数据中止 |
SVC | movs pc, r14_svc |
UND | movs pc, r14_und |
地址 | 异常 | 模式 |
---|---|---|
0x0000 0000 | 复位 | 管理模式 |
0x0000 0004 | 未定义指令 | 未定义模式 |
0x0000 0008 | SWI软件中断 | 管理模式 |
0x0000 000c | 中止(预取指令) | 中止模式 |
0x0000 0010 | 中止(数据) | 中止模式 |
0x0000 0014 | 保留 | 保留 |
0x0000 0018 | IRQ | IRQ |
0x0000001c | FIQ | FIQ |
优先级由高到低:复位,数据中止,FIQ,IRQ,预取指令中止,未定义指令,SWI
FIQ处于异常地址末尾,可省略一条跳转指令