3.1 ARM体系结构
1、ARM的结构特征
(1)Load/Store体系结构,CPU只处理寄存器中的数据
(2)固定的32位指令
(3)三地址指令格式
程序计数器(Program Counter,PC)来存放指令地址。通常每执行一条指令,PC就自动加1,直接得到下一条指令的地址,这样指令中就无须明显的给出下一条指令地址。三地址格式指令:
OP | A1 | A2 | A3 |
(A1) OP (A2) -> A3,OP表示具体的操作,A1、A2表示地址,(A1)、(A2)表示存放在该地址的值。
执行一条三地址的双操作数至少需要访问四次主存,第一次取指令,第二次取第一个操作数,第三次取第二个操作数,第四次保存运算结果。
2、ARM指令集介绍
指令的后缀
(1)S:表示可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码,会影响ARM程序状态寄存器的条件码标志(N,Z,C,V)。
N:运算结果的最高位反映在该标志位,对于有符号二进制补码,结果为负数时N=1,结果为正数时N=0。
Z:指令结果为0时Z=1(表示结果相等),反之则Z=0。
C:当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0;当进行减法运算(包括CMP指令),并且最高位产生借位时C=0,否则C=1;对于结合移位的非加法或减法指令,C为从最高位最后移出的值;其它指令C通常不变。
V:当进行加法/减法运算,并且发生有符号溢出时V=1,否则V=0,其它指令V通常不变。
(2)"!":表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
LDR R0, [R1, #4] ;相当于R0 <- mem[R1+4] R1 = R1 + 4
(3)"^":表示一条特殊形式的指令,在从存储器中装入PC的同时,CPSR也得到恢复。
(4)ARM指令集对数据格式的几个定义:
#号后面加0x或&,表示十六进制
#号后面加0b,表示二进制
#号后面加0d,表示十进制
3、ARM处理器的7种工作模式
(1)用户模式(USR):程序正常工作模式
(2)系统模式(SYS):用于运行特权级的操作系统任务
用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限,可以访问所有系统资源。
(3)快速中断模式(FIQ):用于高速数据传输和处理
(4)外部中断模式(IRQ):用于处理外部设备中断
(5)特权模式(SVC):操作系统保护模式,系统复位和软件中断响应进入该模式
(6)数据访问终止模式(ABT):虚拟存储或存储器保护
(7)未定义指令终止模式(UND):用于处理通过软件仿真硬件协处理器
工作模式 | 特权模式 | 异常模式 |
用户模式 | ||
系统模式 | 该组模式下可以任意访问系统资源 | |
快速中断模式 | 通常由系统异常状态切换进该组模式 | |
外部中断模式 | ||
特权模式 | ||
数据访问终止模式 | ||
未定义指令终止模式 |
4、ARM寄存器
ARM处理器有31个通用寄存器和6个状态寄存器。寄存器按照处理器工作模式划分,有些寄存器被限定在特定模式下访问,有些寄存器可以在任意模式访问。通用寄存器R0~R14、程序计数器PC,以及特定的两个状态寄存器在任何处理模式下都可以访问。
ABORT | USR/SYS | FIQ | IRQ | SVC | UND |
R0 | R0 | R0 | R0 | R0 | R0 |
R1 | R1 | R1 | R1 | R1 | R1 |
R2 | R2 | R2 | R2 | R2 | R2 |
R3 | R3 | R3 | R3 | R3 | R3 |
R4 | R4 | R4 | R4 | R4 | R4 |
R5 | R5 | R5 | R5 | R5 | R5 |
R6 | R6 | R6 | R6 | R6 | R6 |
R7 | R7 | R7 | R7 | R7 | R7 |
R8 | R8 | R8 | R8 | R8 | R8 |
R9 | R9 | R9 | R9 | R9 | R9 |
R10 | R10 | R10 | R10 | R10 | R10 |
R11 | R11 | R11 | R11 | R11 | R11 |
R12 | R12 | R12 | R12 | R12 | R12 |
R13(sp) | R13(sp) | R13(sp) | R13(sp) | R13(sp) | R13(sp) |
R14(lr) | R14(lr) | R14(lr) | R14(lr) | R14(lr) | R14(lr) |
R15(cp) | R15(cp) | R15(cp) | R15(cp) | R15(cp) | R15(cp) |
CPSR | CPSR | CPSR | CPSR | CPSR | CPSR |
SPSR | SPSR | SPSR | SPSR | SPSR |
R13:常作为堆栈指针,处理器的每种模式都有自己的物理寄存器R13,所以在用户应用程序初始化时,都要初始化每种模式的R13,使其指向该运行模式的栈空间,当程序进入异常模式时,可将需要保护的寄存器放入R13所指向的堆栈,当程序从异常模式返回时,则从对应的堆栈中恢复。
R14:子程序链接寄存器(Subroutine Link Register)或链接寄存器(LinkRegister),当子程序调用指令(BL指令)时,R14中得到R15(程序计数器PC的备份),执行完子程序后,又将R14的值复制到R15中,即可完成程序的调用。
R16:CPSR(Current Program Status Register,当前程序状态寄存器)。CPSR可以在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位。
31 | 27 | 24 | 7 | 6 | 5 | 4 | 0 | ||||||||||||||||||||||||
N | Z | C | V | Q | J | undefine | I | F | T | mode |
SPSR(Saved Program Status Register,备份的程序状态寄存器):SPSR寄存器在处理器进入某种异常模式的时候保存之前的CPSR寄存器的值,用于异常处理后恢复CPSR状态。