? R13在ARM指令中常用作堆栈指针SP,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。
? 在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。
? 由于ARM处理器的每种运行模式均有自己独立的物理寄存器R13,在初始化部分,都要初始化每种模式下的R13_
ARM堆栈操作方式:
ARM堆栈操作方式有四种,分别是:
满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
●子程序链接寄存器LR(Link Register)—R14
? R14也称作子程序链接寄存器或子程序返回指针寄存器LR。当执行BL子程序调用指令时,可以从R14中得到R15(程序计数器PC)的备份。其他情况下,R14用作通用寄存器。
? 在每一种运行模式下,都可用R14_
? ?
BL SUB1 ;调用子程序SUB1,有“L”同时PC→LR
? ?
SUB1: STMFD SP!, {
? ?
LDMFD SP!,{
或 MOV PC, LR ;R14→R15,即LR→PC
26
或 BX LR ;跳转指令 LR→PC (3) 程序计数器PC(Program Counter)--R15
? ARM处理器的寄存器R15被用作程序计数器,也称为PC,用于处理器执行指令的地址寻址(指针),物力上只有一个寄存器。
ARM状态下指令总是字对齐,R15值的位[1:0]总为0,PC的位[31:2]用于保存地址;Thumb状态下指令总是半字对齐,R15值的位[0]为0,PC的位[31:1]用于保存地址。 ?寄存器R15虽然也可用作通用寄存器,但一般不这么使用,因为对R15的使用有一些特殊的限制,当违反了这些限制时,程序的执行结果是未知的。由于ARM体系结构采用了多级流水线技术,因此保存在PC的程序地址并不是当前指令的地址。对于3级流水线,PC总是指向当前指令的下两条指令的地址,即PC的值为当前指令的地址值加8个字节。而对于5级流水线,PC的值为当前指令的地址值加12个字节。 2、程序状态寄存器 (CPSR/SPSR)
寄存器R16用作当前程序状态寄存器CPSR(Current Program Status Register),CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、工作状态位、当前处理器模式标志位以及其他一些相关的控制位。
? ARM处理器的每种异常运行模式下又都有一个备用的物理状态寄存器,称为备份的程序状态寄存器SPSR(Saved Program Status Register),异常发生时,SPSR用于保存CPSR的值,以便从异常退出时则可由SPSR来恢复CPSR。由于用户模式和系统模式不属于异常模式,他们没有SPSR,当在这两种模式下访问SPSR时,结果是未知的。程序状态寄存器 (CPSR/SPSR)模型如下:
图xx 不同模式下的程序状态寄存器
(1)程序状态寄存器(CPSR)的位定义
? ARM体系结构包含1个当前程序状态寄存器(CPSR)和5个备份的程序状态寄存器(SPSRs)。用来保存ALU中的当前操作信息、 控制允许和禁止中断、 设置处理器的运行模式。程序状态寄存器的每一位的定义如图xx
27
图 xx 程序状态寄存器位的定义
CPSR[31:1]共2位被划分成4个域,分别对应4个字节。CPSR[7:0]为控制域(C), CPSR[15:8]为扩展域(X), CPSR[23:16]为状态域(S), CPSR[31:24]为标志域(F)。在对CPSR进行操作时,可以按域进行。 (2)程序状态寄存器(CPSR)的条件码标志
N、Z、C、V均为条件码标志位。它们的内容可被算术或逻辑运算的结果所改变,并且可以决定某条指令是否被执行。
? 在ARM状态下,绝大多数的指令都是有条件执行的。? 在Thumb状态下,仅有分支指令是有条件执行的。 标志位 N Z 含 义 当用两个补码表示的带符号数进行运算时,N=1 表示运算的结果为负数;N=0 表示运算的结果为正数或零; Z=1 表示运算的结果为零;Z=0表示运算的结果为非零; 加法运算结果进位时,C=1;减法运算借位时,C=0; C 移位操作的非加/减运算指令,C为移出的最后一位; 其他的非加/减运算指令,C的值通常不改变。 加/减法运算指令,V=1表示符号位溢出。 对于其他的非加/减运算指令,V的值通常不改变。 在ARM v5及以上版本的E系列处理器中,Q标志指示DSP运算指令是否溢出。在其他版本中,Q标志位无定义。 V Q 28
影响标志位的指令:
比较,算术、逻辑和MSR、MRC、LDM指令。 (3)程序状态寄存器(CPSR)的控制位
状态寄存器的CPSR[7:0]位即(I、F、T和M[4:0])称为控制位,发生异常时这些位可以被改变。如果处理器运行特权模式,这些位也可以由程序修改。
中断禁止位I、F:?当I=1时 禁止IRQ中断,当I=0且F=0时,允许IRQ请求中断;? 当F=1时 禁止FIQ中断,当F=0时 允许FIQ请求中断。 工作状态标志位T:该位反映处理器的工作状态,ARM体系结构v5及以上的版本的T系列处理器中,当T=1时,程序运行于Thumb工作状态,否则运行于ARM工作状态。CPSR[T]可以通过指令BX Rm改变。?
运行模式位M[4:0]:模式位码决定处理器的运行模式,… …
表xx ARM处理器运行模式及运行模式下可以访问的寄存器
M[4:0] 0b10000 0b10001 0b10010 0b10011 0b10111 0b11011 0b11111 处理器模式 用户模式 FIQ模式 IRQ模式 管理模式 中止模式 可访问的寄存器 PC,CPSR,R0-R14 PC,CPSR, SPSR_fiq,R14_fiq-R8_fiq, R7~R0 PC,CPSR, SPSR_irq,R14_irq, R13_irq, R12~R0 PC,CPSR,,SPSR_svc,R14_svc,R13_svc, R12~R0, PC,CPSR,SPSR_abt,R14_abt,R13_abt, R12~R0, 未定义模式 PC,CPSR,SPSR_und,R14_und,R13_und,R12~R0, 系统模式 PC,CPSR(ARM v4及以上版本), R14~R0 当进入某种运行模式时,当前模式下CPSR的M[4:0]位被强制设置为该运行模式码。 注意:CPSR/SPSR的位值是可以修改的,但不能直接用立即数修改,要通过“读取-修改-回写”的操作实现其内容修改。运行模式位的修改与设置指令为:MSR、MRS。
例如:MRS R0,CPSR ; R0←CPSR
BIC R0,R0,#0x1F ;修改R0,即R0[4:0]=0
ORR R0,R0,#0x11 ;修改R0,即R0[4:0]=0x11,设置模式为FIQ模式 MRS CPSR,RO ;CPSR←R0
29
二、Thumb状态下的寄存器组织
? Thumb状态下的寄存器集共有27个寄存器,它是ARM状态下寄存器集的一个子集,程序可以直接访问8个通用寄存器(R7~R0)、程序计数器(PC)、堆栈指针(SP)、连接寄存器(LR)和CPSR。同样,每一种特权模式下都有一组SP、LR和SPSR。
Thumb状态下的寄存器集是ARM状态下寄存器集的一个子集,其寄存器组织如图xx。
图xx Thumb状态下的寄存器组织图
说明:Thumb状态下的寄存器与ARM状态下的寄存器既有相同之处,也有不同之处,如图xx所示。
30