ARM寄存器介绍

ARM处理器共有37个寄存器。其中包括:spa

  • 31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。
  • 6个状态寄存器,这些寄存器都是32位寄存器,可是目前只是用其中的12位。

ARM处理器共有7种不一样的处理器模式,在每一种处理模式中有一组相应的寄存器组。任意时刻,可见的寄存器包括15个通用寄存器(R0~R14),一个或两个状态寄存器及程序计数器。在全部寄存器中,有些是各模式共用的同一个物理寄存器;有一些是各模式本身拥有的独立的物理寄存器。下表列出了各类处理器模式下可见的寄存器状况。设计

各类处理器模式下的寄存器指针

用户模式 系统模式 特权模式 停止模式 未定义指令模式 外部中断模式 快速中断模式
R0 R0 R0 R0 R0 R0 R0
R1 R1 R1 R1 R1 R1 R1
R2 R2 R2 R2 R2 R2 R2
R3 R3 R3 R3 R3 R3 R3
R4 R4 R4 R4 R4 R4 R4
R5 R5 R5 R5 R5 R5 R5
R6 R6 R6 R6 R6 R6 R6
R7 R7 R7 R7 R7 R7 R7
R8 R8 R8 R8 R8 R8 R8_FIQ
R9 R9 R9 R9 R9 R9 R9_FIQ
R10 R10 R10 R10 R10 R10 R10_FIQ
R11 R11 R11 R11 R11 R11 R11_FIQ
R12 R12 R12 R12 R12 R12 R12_FIQ
R13 R13 R13_SVC R13_ABT R13_UND R13_IRQ R13_FIQ
R14 R14 R14_SVC R14_ABT R14_UND R14_IRQ R14_FIQ
PC PC PC PC PC PC PC
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
    SPSR_SVC SPSR_ABT SPSR_UND SPSR_IRQ SPSR_FIQ

通用寄存器介绍:内存

通用寄存器能够分为下面3类:ci

  • 未备份寄存器,包括R0~R7;
  • 备份寄存器,包括R8~R14;
  • 程序计数器,即R15。

未备份寄存器:it

未备份寄存器包括R0~R7。对于每个未备份寄存器来讲,在全部的处理器模式下指的都是同一个物理寄存器。在异常中断形成处理器模式切换时,因为不一样的处理器模式使用相同的物理寄存器,可能形成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何采用通用寄存器的应用场合均可以使用未备份寄存器。table

备份寄存器:扩展

对于备份寄存器R8~R12来讲,每一个寄存器对应两个不一样的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器R8和寄存器R9分别记做为R8_FIQ、R9_FIQ;当使用用户模式下的寄存器时,寄存器R8和R9分别记做R8_USR、R9_USR等。在这两种状况下,使用的是不一样的物理寄存器。系统没有将这几个寄存器用于特殊的用途,可是当中断处理很是简单,仅仅使用R8~R14寄存器时,FIQ处理程序能够没必要执行保存和恢复中断现场的指令,从而可使中断处理过程很是迅速。软件

对于备份寄存器R13和R14来讲,每一个寄存器对应6种不一样的物理寄存器,其中的一个是用户模式和系统模式共用的,另外5个对应于其余的5种处理器模式。采用下面的记号来区分各个物理寄存器。二进制

R13_<mode>

其中,<mode>能够是下面几种状况之一:usr、svc、abt、und、irq和fiq。

寄存器R13在ARM中经常使用做栈指针(sp)。在ARM指令集中,这只是一种习惯的用法,并无任何指令强制性地使用R13做为栈指针,用户也可使用其余的寄存器做为栈指针;而在Thumb指令集中,有一些指令强制使用R13做为栈指针。

每一种异常模式拥有本身的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,能够将须要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。

寄存器R14又被称为链接寄存器(LR),在ARM体系中具备下面两种特殊的做用:

每一种处理器模式本身的物理R14中存放着当前子程序的返回地址。当经过BL跳转指令调用子程序是,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。能够经过下面的两种方式实现这种子程序的返回操做。

执行下面的任何一条指令:

        MOV PC, LR

        BX LR

在子程序入口使用下面的指令将PC保存到栈中:

STMFD SP!, {<registers>, LR}

相应的,下面的指令能够实现子程序的返回:

LDMFD SP!, {<register>, PC}

当异常中断发生时,该异常模式特定的物理寄存器R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。

R14寄存器也能够做为通用寄存器来使用。

程序计数器R15(PC):

程序计数器R15又被记做PC。它虽然能够做为通常的通用寄存器使用,可是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。

因为ARM采用流水线机制,当正确读取了PC的值时,该值为当前指令的地址加8个字节。也就是说,对于ARM指令集来讲,PC指向当前指令的下两条指令的地址。因为ARM指令是字节对齐的,PC值的第0位和第1位老是0。

须要注意的是,当使用指令STR/STM保存R15时,保存的多是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。究竟是哪一种方式,取决于芯片的具体设计方式。不管如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12字节,不能有些指令采用当前指令地址加8,另外一些指令采用当前指令地址加12。所以对于用户来讲,尽可能避免使用STM/STR指令来保存R15的值。当不可避免这种使用方式时,能够先经过一些代码来肯定所用的芯片使用的是哪一种方式。假设R0指向可用的一个内存字,下面的代码能够在R0指向的内存字中返回该芯片所采用的地址偏移量。

SUB R1, PC ,#4        @R1中存放下面STR指令的地址

STR PC, [R0]            @PC=STR地址加offset保存到R0中

LDR R0, [R0]

SUB R0, R0, R1        @offset=PC-STR地址

在上面的讨论中,都是针对指令返回的值。该值并不是在指令读取期间出如今数据总线上的值。在指令读取期间出如今数据总线上的值取决于芯片的具体实现方式。

当成功的向R15中写入一个地址值时,程序将跳转到该地址执行。因为ARM指令是字对齐的,写入R15的地址值应该知足bits[1:0]=0b00,至于具体的要求,ARM各版本有所不一样。

对于Thumb指令集来讲,指令是半字节对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0xFFFFFFFE作与操做,再写入R15中。

还有一些指令对R15的用法有一些特殊的要求。好比,指令BX利用bit[0]来肯定是ARM指令,仍是Thumb指令。

这种读取PC值和写入PC值的不对称的操做须要特别注意。这一点在之后的章节还有介绍。如指令"MOV PC, PC"将程序跳转到当前指令下面第2条指令处执行。由于指令中,第2个PC寄存器读出的值为当前指令的地址值加8,这样对ARM指令而言,写入PC寄存器的是当前指令下面第2条指令的地址。相似的指令还有"ADD PC, PC, #0"。

程序状态寄存器:

CPSR(当前程序状态寄存器)能够在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其余的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,能够用SPSR中保存的值来恢复CPSR。

因为用户模式和系统模式不是异常中断模式,因此它们没有SPSR。当在用户模式或系统模式中访问SPSR时,将会产生不可预知的结果。

CPSR的格式以下所示。SPSR格式与CPSR的格式相同。

31 30 29 28 27 26 7 6 5 4 3 2 1 0
N Z C V Q DNM I F T M4 M3 M2 M1 M0

条件标志位:

N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令能够根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义以下表所示。

CPSR中的条件标志位

标志位 含义
N 本位设置成当前指令运算结果的bit[31]的;当两个补码表示的有符号整数运算时,N=1表示运算的结果的为负数,N=0表示结果为正数或零。
Z Z=1表示运算结果为零;Z=0表示运算的结果不为零,对于CMP指令,Z=1表示进行比较的两个数大小相等
C

下面分4种状况讨论C的设置方法:

在加法指令中,当结果产生了进位,则C=1,表示无符号数运算发生了上溢;其余状况下为0;

在减法指令中,当运算发生了借位,则C=0,表示无符号数运算发生下溢出,其余状况下为0;

对于其余非加/减运算指令,C位的值一般不受影响。

V 对于加/减法指令,当操做数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。

如下指令会影响CPSR中的条件标志位:

  • 比较指令,如CMP、CMN、TEQ和TST等;
  • 当一些算数运算指令和逻辑指令的目标寄存器不是R15时,这些指令会影响CPSR中的条件标志位;
  • MSR指令能够向CPSR/SPSR中写入新值;
  • MSC指令将R15做为目标寄存器时,能够把协处理器产生的条件标志位的值传送到ARM处理器;
  • 一些LDM指令的变种指令能够将SPSR的值复制到CPSR中,这种操做注意用于从异常中断程序中返回;
  • 一些带“位设置”的算术和逻辑指令的变种指令,也能够将SPSR的值复制到CPSR中,这种操做主要用于从异常中断程序中返回。

Q标志位:在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示加强的DSP指令是否发生了溢出。一样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

CPSR中的控制位:

CPSR的低8位I、F、T及M[4:0]统称为控制位。当异常中断发生时,这些位发生变化。在特权级的处理器模式下,软件能够修改这些控制位。

(1)中断禁止位:

当I=1时禁止IRQ中断;

当F=1时禁止FIQ中断;

(2)T控制位:

T控制位用于控制指令执行的状态,即说明指令是ARM指令,仍是Thumb指令。对于不一样版本的ARM处理器,T控制位的含义不一样。

对于ARMv4以及更高的版本的T系列的ARM处理器,T控制位的含义以下:

T=0表示执行的ARM指令;

T=1表示执行的Thumb指令;

(3)M控制位:

控制位M[4:0]控制处理器模式,具体含义以下表所示:

M[4:0] 处理器模式 可访问的寄存器
0b10000 User PC,R0~R14,CPSR
0b10001 FIQ PC,R0~R7,R8_fiq~R14_fiq,CPSR,SPSR_fiq
0b10010 IRQ PC,R0~R7,R8_irq~R14_irq,CPSR,SPSR_irq
0b10011 Supervisor PC,R0~R7,R8_svc~R14_svc,CPSR,SPSR_svc
0b10111 Abort PC,R0~R7,R8_abt~R14_abt,CPSR,SPSR_abt
0b11011 Undefined PC,R0~R7,R8_und~R14_und,CPSR,SPSR_und
0b11111 System PC,R0~R14,CPSR

CPSR中其余位:CPSR中的其它位用于未来ARM版本的扩展,应用软件不要操做这些位,以避免与ARM未来版本的扩展冲突。

相关文章
相关标签/搜索