一、寄存器
ARM共有37个寄存器,都是32位长度的。
ARM中共有37个寄存器,其中30个为“通用型寄存器”,一个固定做PC,一个固定做CPSR
5个固定做5种异常模式SPSR。
不分组寄存器(R0-R7)
分组寄存器(R8-R14)
程序计数器R15(PC)
不分组寄存器:
R0-R7是不分组寄存器。这意味着在所有处理器模式下,访问的都是同一个物理寄存器。不分组寄存器
没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。
分组寄存器:
FIQ模式分组寄存器R8-R12
FIQ模式以外的分组寄存器R8-R12
分组寄存器:
寄存器R13通常做堆栈指针SP
寄存器R14用作子程序链接寄存器也成为LR,指向函数的返回地址
程序计数器:
寄存器R15被用作程序计数器,也称PC。其值等于当前正在执行的指令的地址+8(因为在取址和执行间多
一个译码的阶段)。
状态寄存器:
CPSR:ARM所有工作模式下都可以访问程序状态寄存器CPSR。CPSR包含条件码标志、中断禁止位、当前
处理器模式以及其他状态和控制信息。
CPSR在每个异常模式下都有一个对应的物理寄存器-程序状态保存寄存器SPSR。当异常出现时,SPSR用
于保存CPSR的值,以便异常返回后恢复异常发生时的工作状态。
二、模式极其对应的寄存器
USER模式:正常用户模式,程序正常执行模式
FIQ模式:处理快速中断,支持高速数据传送或通道处理
IRQ模式:处理普通中断
SVC模式:操作系统保护模式,处理软件中断swi Reset
ABT(终止)模式:处理存储器故障,实现虚拟存储器和存储器保护
UND(未定义)模式:处理未定义的指令陷阱,支持硬件协处理器的软件仿真
SYS(系统基本上和USER模式相等)模式:运行特权操作系统任务(使用和USER模式下相同的寄存器的
特权模式)
除用户模式其他的6中模式成为特权模式,在特权模式下,程序可以访问所有的系统资源,也可以
任意地进行处理器模式间的切换。
特权模式中除了系统模式其他的5种模式被称为异常模式。
三、异常处理
当一种异常发生时,硬件会自动做如下的事:
1、保存执行状态:将CPSR保存到相应异常模式下的SPSR中
2、模式切换:将CPSR模式位强制设置为与异常类型相对应的值,同时处理器进入到ARM执行模式,禁止
所有的IRQ中断,当进入FIQ模式时,禁止FIQ中断。
3、保存返回地址:将下一条指令的地址(被打断的程序)保存在LR(该异常模式下的R14)中
4、跳入异常向量表:强制设置PC的值为相应异常向量地址,跳转到异常处理程序中
异常处理完成后,返回被打断程序继续执行(这些是我们手动需要完成的):
1、恢复被打断程序运行时寄存器数据
2、恢复程序运行状态CPSR
3、通过进入异常时保存的返回地址,返回到被打断程序继续执行
上述操作通常可以通过一条指令实现上述全部操作:
LDMFD SP_excp!, {r0-r12, pc}^
注:SP_excep为对应异常模式下SP,^符号表示恢复SPSR_excep到CPSR
欢迎各位指出不足之处