ARM体系结构与编程

ARM概述与基本编程模型

ARM处理器模式

  • 用户模式(User, usr)

  • 快速中断模式(FIQ, fig)

  • 外部中断模式(IRQ, irq)

  • 特权模式(Supervisor, sve)

  • 数据访问中止模式(Abort, abt)

  • 未定义指令中止模式(Undefined, und)

  • 系统模式(System, sys)

用户模式外的其他6种处理器模式称为特权模式。这其中,除系统模式外,其他5种模式外,其他5种特权模式称为异常模式。

ARM寄存器

ARM处理器共有37个寄存器,包括:

  • 31个通用寄存器,包括程序计数器(PC)在内。都是32位

  • 6个状态寄存器。32位,只是用其中12位

ARM处理器共有7种不同的处理器模式,每种模式有一组相应的寄存器组。

任意时刻,可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。

通用寄存器

分为3类:

  • 未备份寄存器,包括R0~R7

  • 备份寄存器,包括R8~R14

  • 程序计数器PC,即R15

程序状态寄存器

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控制处理器模式。

ARM体系的异常中断

执行流程的控制:

  • 顺序执行

  • 跳转指令

  • 中断发生

ARM中异常中断种类

异常中断名称 含义
复位(Reset) 当处理器复位引脚有效,产生复位中断,程序跳转到复位异常中断处理程序处执行。系统加电、系统复位、跳转到复位中断向量处执行(软复位)
未定义的指令(undefine instruction) 处理器或协处理器认为当前指令未定义
软件中断(SWI) 用户模式下的程序调用特权操作指令
指令预取中止(prefech abort) 预取的指令的地址不存在
数据访问中止(Data Abort) 数据访问指令的目标地址不存在
外部中断请求(IRQ) 处理器的外部中断请求引脚有效
快速中断请求(FIQ) 处理器的外部快速中断请求引脚有效

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

从异常中断处理程序中返回

  • 恢复被中断的程序的处理器状态,即将SPSR_mode寄存器内容复制到CPSR中

  • 返回到发生异常中断的指令的下一条指令处执行,即将lr_mode寄存器的内容复制到程序计数器PC中。

复位异常中断处理程序不需要返回,在复位异常中断处理程序开始整个用户程序的执行,因而它不需要返回

ARM体系中的存储系统

ARM体系中的存储空间

ARM存储器的格式

  • big-endian

  • little-endian

非对齐的存储访问操作
  • 非对齐的指令预取操作

    指令的执行结果不可预知,要么地址值中最低位被忽略

  • 非对齐的数据访问操作

    对于Load/Store操作:

  1. 执行结果不可预知

  2. 忽略字单元地址的低两位的值;忽略半字单元地址的最低位的值

  3. 忽略字单元地址值中的低两位的值;忽略半字单元地址的最低位的值

指令预取和自修改代码

猜你喜欢

转载自www.cnblogs.com/luoxiao23/p/11095032.html