ARM寄存器小结

ARM 76浏览

微处理器支持7种运行模式,分别为:
1.   用户模式(usr):处理器正常的程序执行状态;
2.   快速中断模式(fiq):用于高速数据传输或通道管理;
3.   外部中断模式(irq):用于通用的中断处理;
4.   管理模式(svc):操作系统使用的保护模式;
5.   数据访问终止模式(abt):当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护;
6.   系统模式(sys):运行具有特权的操作系统任务;
7.   未定义指令中止模式(und):当未定义指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

 

体系结构的存储器格式有如下两种:
 大端格式:字数据的高字节存储在低地址中,字数据的低字节存放在高地址中;
 小端格式:与大端存储格式相反,高地址存放数据的高字节,低地址存放数据的低字节

 

 总结:
  有16个32位的(r0到r15)。
 r15充当程序PC,r14(link
register)存储子程序的返回地址,r13存储的是堆栈地址。

有一个当前程序状态:CPSR。
一些(r13,r14)在异常发生时会产生新的instances,比如IRQ处理器模式,这时处理器使用r13_irq和r14_irq
 的子程序调用是很快的,因为子程序的返回地址不需要存放在堆栈中。

 


1、 处理器共有37个,其中包括:

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

ii. 6个状态,都是32位,但目前只使用了其中12位

 

2、 处理器有7种不同的处理器模式,在每一种处理器模式中有一组相应的组。任意时刻(也就是任意的处理器模式下),可见的包括15个通用(R0~R14)、一个或两个状态及程序计数器(PC)。在所有的中,有些是各模式共用的同一个物理,有些是各模式自己拥有的独立的物理

 

3、 通用可以分为3类:未备份(R0~R7)、备份(R8~R14)和程序计数器PC(R15)。对于每一个未备份来说,在所有的处理器模式下指的都是同一个物理对应备份R8~R12来说,每个对应两个不同的物理,这使得中断处理非常简单。示例,仅仅使用R8~R14时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而使中断处理过程非常迅速。对于备份R13和R14来说,每个对应6个不同的物理,其中的一个是用户模式和系统模式共用的,另外的5个对应于其他5种处理器模式。


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

 

5、 R14又被称为连接(Link
Register,LR)
,在体系中具有下面两种特殊的作用:

i. 每一种处理器模式自己的物理R14中存放当前子程序的返回地址当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回

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

 

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

 

7、 对于版本3以及更低的版本,写入R15的地址值的bits[1:0]被忽略,对于版本4以及更高的版本,程序必须保证写入R15的地址值的bits[1:0]为0b00;否则会产生不可预知的结果对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0]

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

 

8、 指令mov pc, pc将程序跳转到当前指令下面第2条指令处执行。类似的指令还有add pc, pc, #0

 

9、 每一种处理器模式下都有一个专用的物理状态,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个用于存放当前程序状态的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR

 

10、 由于用户模式和系统模式不是异常中断模式,所以它们没有SPSR。当在用户模式或系统模式中 访问SPSR,将会产生不可预知的结果

 

 

-----------------------------------------------------------------------------------------------------

 

ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及632位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0R14)、一个或两个状态寄存器及程序计数器(PC)

 

1  各种处理器模式下的寄存器
用户模式 系统模式 特权模式 中止模式 未定义指令模式 外部中断模式 快速中断模式
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
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_inq R13_fiq
R14 R14 R14_svc R14_abt R14_und R14_inq R14_fiq
PC PC PC PC PC PC PC
CPSR CPSR
CPSR
SPSR_svc
CPSR
SPSR_abt
CPSR
SPSR_und
CPSR
SPSR_inq
CPSR
SPSR_fiq

 

 

 

未备份寄存器包括R0R7。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。

对于备份寄存器R8R12来说,每个寄存器对应两个不同的物理寄存器。系统没有将这几个寄存器用于任何的特殊用途,但是当中断处理非常简单,仅仅使用R8R14寄存器时,FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。对于备份寄存器R13R14,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式共用的;另外的5个对应于其他5种处理器模式。采用记号R13_<mode>来区分各个物理寄存器:其中,<mode>可以是下面几种模式之一:usrsvcabtundirqfiq
寄存器R13ARM中常用作栈指针。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指针;而Thumb指令集中,有一些指令强制性地使用R13作为栈指针。每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。
寄存器R14又被称为连接寄存器(Link
Register
LR),在ARM体系中具有下面两种特殊的作用:
1、每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BLBLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回2、当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。R14寄存器也可以作为通用寄存器使用。  

由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。
由于ARM指令是字对齐的,PC值的第0位和第1位总为0。需要注意的是,当使用指令STRSTM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STRSTM指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种实现方式
对于ARM版本4以及更高的版本,程序必须保证写入R15寄存器的地址值的bits[10]0b00;否则将会产生不可预知的结果对于Thumb指令集来说,指令是半字对齐的,处理器将忽略bit[0]。即写入R15的地址值首先与0XFFFFFFFC做与操作,再写入R15
还有—些指令对于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。这种读取PC值和写入PC值的不对称的操作需要特别注意。
需要注意的是,当使用str/stm保存R15时,保存的可能是当前指令地址值加8个字节,也可能保存的是当前指令地址值加12个字节。到底哪种方式取决于芯片的具体设计。对于用户来说,尽量避免使用STR/STM指令来保存R15的值
当成功的向R15写入一个数值时,程序将跳转到该地址执行。由于ARM指令是字对齐的,写入R15的值应满足bits[1:0]为0b00,具体要求arm各版本有所不同:
**对于arm3以及更低的版本,写入R15的地址值bits[1:0]被忽略,即写入r15的地址值将与0xFFFF FFFC做与操作。
**对于ARM4以及更高的版本,程序必须保证写入R15的地址值bits[1:0]为0b00,否则将产生不可预知的后果。
对于Thumb指令集来说,指令是半字对齐的,处理器将忽略bit[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(RAZ) I F T M4 M3 M2 M1
M0

ARM体系使用单—的平板地址空间。该地址空间的大小为2328位字节。这些字节单元的地址是一个无符号的32位数值,其取值范围为02321ARM的地址空间也可以看作是23032位的字单元。这些字单元的地址可以被4整除,也就是说该地址的低两位为0b00地址为A的字数据包括地址为AAIA2A3,4个字节单元的内容
ARM版本4及以上的版本中,ARM的地址空间也可以看作是23116位的半字单元。这些半字单元的地址可以被2整除,也就是说该地址的最低位为0b0。地址为A的半字数据包括地址为AA1两个字节单元的内容
各存储单元的地址作为32位的无符号数,可以进行常规的整数运算。这些运算的结果进行232取模。也就是说,运算结果发生上溢出和下溢出时,地址将会发生卷绕。

ARM体系中,每个字单元中包含4个字节单元或者两个半字单元:1个半字单元中包含两个字节单元。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian格式和little-endian格式。
big-endian格式中,对于地址为A的字单元包括字节单元AA1A2A3,其中字节单元由高位到低位字节顺序为AA1A2A3;地址为A的字单元包括半字单元AA2,其中半字单元由高位到低位字节顺序为AA2:地址为A的半字单元包括字节单元AA1,其中字节单元由高位到低位字节顺序为AA1  

在little-endian格式中,地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A+3、A+2、A+1、A;地址为A的字单元包括半字节单元A、A+2,其中半字单元由高位到低位字节顺序为A+2、A;地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A+1、A