EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM处理器共有37个寄存器。其中包括:31个通用寄存器,包括程序计数器(PC)在内。这些寄存器都是32位寄存器。以及6个32位状态寄存器。但目前只使用了其中12位。ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。任意时刻(也就是任意的处理器模式下),可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。在所有的寄存器中,有些是各模式共用的同一个物理寄存器;有一些寄存器是各模式自己拥有的独立的物理寄存器。表1列出了各处理器模式下可见的寄存器情况。 " [' o z& v# O9 K
表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 | 4 y( g, i5 Q( M* J* x" b
+ q$ [! g: k- _6 d* z, Y% r通用寄存器通用寄存器可以分为下面3类:未备份寄存器(The unbanked registers),包括R0~R7。备份寄存器(The banked registers),包括R8~R14。程序计数器PC,即R15。 未备份寄存器未备份寄存器包括R0~R7。对于每一个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器。在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。 备份寄存器对于备份寄存器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中常用作栈指针。在ARM指令集中,这只是一种习惯的用法,并没有任何指令强制性的使用R13作为栈指针,用户也可以使用其他的寄存器作为栈指 针;而在Thumb指令集中,有一些指令强制性地使用R13作为栈指针。 每一种异常模式拥有自己的物理的R13。应用程序初始化该R13,使其指向该异常模式专用的栈地址。当进入异常模式时,可以将需要使用的寄存器保存在R13所指的栈中;当退出异常处理程序时,将保存在R13所指的栈中的寄存器值弹出。这样就使异常处理程序不会破坏被其中断程序的运行现场。 寄存器R14又被称为连接寄存器(Link Register,LR),在ARM体系中具有下面两种特殊的作用:每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。当通过BL或BLX指令调用子程序时,R14被设置成该子程序的返回地址。在子程序中,当把R14的值复制到程序计数器PC中时,子程序即返回。 当异常中断发生时,该异常模式特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。具体的返回方式与上面的子程序返回方式基本相同。 R14寄存器也可以作为通用寄存器使用。 程序计数器R15程序计数器R15又被记作PC。它虽然可以作为一般的通用寄存器使用,但是有一些指令在使用R15时有一些特殊限制。当违反了这些限制时,该指令执行的结果将是不可预料的。 由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。 由于ARM指令是字对齐的,PC值的第0位和第1位总为0。需要注意的是,当使用指令STR/STM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STR/STM指令来保存R15的值。当不可避免这种使用方式时,可以先通过一些代码来确定所用的芯片使用的是哪种实现方式。 对于ARM版本4以及更高的版本,程序必须保证写入R15寄存器的地址值的bits[1:0]为0b00;否则将会产生不可预知的结果。 对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0],即写入R15的地址值首先与0XFFFFFFFC做与操作,再写入R15中。 还有—些指令对于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]来确定是ARM指令,还是Thumb指令。这种读取PC值和写入PC值的不对称的操作需要特别注意。 程序状态寄存器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 | ( b( u# n5 c" t* r, M, i8 G" }
5 _6 {% {- Z8 N: c# {条件标志位N(Negative)、Z(Zero)、C(Carry)及V(oVeRFlow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如表2所示。
1 e) k0 c- s) S R2 C# s8 P) D表2 CPSR中的条件标志位 标志位 | 含 义 | N | 本位设置成当前指令运算结果的bit[31)的值 当两个补码表示的有符号整数运算时,N=I表示运算的结果为负数;N=0表示结果为正数或零 | Z | Z=1表示运算的结果为零;Z=0表示运算的结果不为零。 对于CMP指令,Z=1表示进行比较的两个数大小相等。 下面分4种情况讨论C的设置方法: 在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。 在减法指令中(包括比较指令CMP),当运算中发生借位则C=0表示无符号数运算发生下溢出;其他情况下C=1。 对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出的位数数值。 对于其他非加/减法运算指令,C位的值通常不受影响。 | V | 对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时V=1表示符号位溢出。 通常其他的指令不影响V位,具体可参考各指令的说明。 | : y- w: F- a6 H. K+ F9 X
+ r6 v% g- v) h) ^ c
Q标志位在ARMv5的E系列处理器中,CPSR的bit[27]称为Q标志位,主要用于指示增强的 DSP指令是否发生了溢出。同样的SPSR中的bit[27]也称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。 在ARM v5以前的版本及ARM v5的非E系列的处理器中,Q标志位没有被定义。CPSR的bit[27]属于DNM(RAZ)。 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=0表示执行ARM指令。 T=1表示执行Thumb指令。 对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位含义如下: T=0表示执行ARM指令。 T=1表示强制下一条执行的指令产生未定义指令中断。 3) M控制位 控制位M[4:0]控制处理器模式,具体含义如表3所示。 表3控制位M[4:0] 的含义 M[4:0] | 处理器模式 | 可访问的寄存器 | 0b10000 | User | PC,R14一R0,CPSR | 0b10001 | FIQ | PC,R14_fiq-R8_flq,R7~R0,CPSR,SPSR_nq | 0b10010 | 1RQ | PC,R14 _irq-R13 _irq,R12一R0,CPSR,SPSR_ irq | 0b10011 | Supervisor | PC,R14_ svc-R13 _svc,R12~R0,CPSR,SPSR_svc | 0b10111 | Abort | PC,R14_abt-R13_abt,R12~R0,CPSR,SPSR_abt | 0b11011 | Undefined | PC,R14_und-R13_und,R12~R0,CPSR,SPSR_ und | | | | |
6 i% v, `) N( D2 R M$ {; D3 L
& a& K2 ?9 e) [- H* B9 SCPSR中的其他位CPSR中的其他位用于将来ARM版本的扩展。应用软件不要操作这些位,以免与ARM将来版本的扩展冲突。 ARM体系中的存储空间ARM体系使用单—的平板地址空间。该地址空间的大小为232个8位字节。这些字节单元的地址是一个无符号的32位数值,其取值范围为0到232—1。ARM的地址空间也可以看作是232个32位的字单元。这些字单元的地址可以被4整除,也就是说该地址的低两位为0b00。地址为A的字数据包括地址为A、A+I、A+2、A+34个字节单元的内容。 在ARM版本4及以上的版本中,ARM的地址空间也可以看作是231个16位的半字单元。这些半字单元的地址可以被2整除,也就是说该地址的最低位为0b0。地址为A的半字数据包括地址为A、A+1两个字节单元的内容。 各存储单元的地址作为32位的无符号数,可以进行常规的整数运算。这些运算的结果进行232取模。也就是说,运算结果发生上溢出和下溢出时,地址将会发生卷绕。 ARM存储器格式在ARM体系中,每个字单元中包含4个字节单元或者两个半字单元:1个半字单元中包含两个字节单元。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式:big-endian格式和little-endian格式。在big-endian格式中,对于地址为A的字单元包括字节单元A、A+1、A+2及A+3,其中字节单元由高位到低位字节顺序为A、A+1、A+2、A+3;地址为A的字单元包括半字单元A、A+2,其中半字单元由高位到低位字节顺序为A、A+2:地址为A的半字单元包括字节单元A、A+1,其中字节单元由高位到低位字节顺序为A、A+1。 在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 ARM处理器包含多少寄存器?每种模式下又有那些寄存器?这些寄存器的作用又是什么?带着这些问题我们来学习ARM寄存器吧!相信看完这篇文章后你会有所收获。( Y- O+ }" b3 l6 L) U- ]
ARM处理器共有37个寄存器。
( C# X: d2 _. G; I2 o4 R' a$ q1 D& ?它包含31个通用寄存器和6个状态寄存器。 =======================================================================================
( _! r; t( D: d; }, @Usr System Supervisor Abort Undefined IRQ FIQ8 E9 h) B2 Z0 G$ y t
----------------------------------------------------------------------------------------------------------------
6 w8 P3 K$ o7 ~0 O) C, N! B0 sR0 R0 R0 R0 R0 R0 R03 w* U* r4 O8 L' b# N: J
R1 R1 R1 R1 R1 R1 R1
7 o8 ~* o2 _* |- _; ]9 PR2 R2 R2 R2 R2 R2 R2
1 _8 K: y) q" p( |) A8 h! wR3 R3 R3 R3 R3 R3 R34 |( @9 B& d: r$ }& K& p
R4 R4 R4 R4 R4 R4 R4
" M( ^" j) ?+ p8 M( ?R5 R5 R5 R5 R5 R5 R5
" z8 V2 T) i/ L; C1 j9 JR6 R6 R6 R6 R6 R6 R6' Z, b( ?/ U4 {+ J' s! _: o$ H
R7 R7 R7 R7 R7 R7 R7
( |) t* l' w. i* j5 b- r; @ Z/ xR8 R8 R8 R8 R8 R8 R8_fiq$ T( E( K2 i* u0 d3 b2 `8 y
R9 R9 R9 R9 R9 R9 R9_fiq
$ F% F2 Z6 P- T) o$ T. f# b3 ]: \( zR10 R10 R10 R10 R10 R10 R10_fiq
' U. u. |. F, F) Q3 v& M& ER11 R11 R11 R11 R11 R11 R11_fiq: f G, d! V" g
R12 R12 R12 R12 R12 R12 R12_fiq
+ F( S! E) @2 T1 p1 Z1 k' yR13 R13 R13_svc R13_abt R13_und R13_irq R13_fiq. l$ P5 H7 m! @4 }( N+ E. Y
R14 R14 R14_svc R14_abt R14_und R14_irq R14_fiq' {8 z2 x; W+ z1 T8 K" C6 f% s, ~
PC PC PC PC PC PC PC( f! U7 g) R) p8 H. y4 c
CPSR CPSR CPSR CPSR CPSR CPSR CPSR
% U+ J& M. d }; I; H$ k5 @ SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq
6 h5 d e$ I# W/ x V0 r( f7 ^=======================================================================================
: ]1 y! q1 I9 P, p1.通用寄存器的分类:
: q- w$ w5 H2 na.未备份寄存器,包括R0-R7+ b! s" b% m! t& E& o
对每个未备份寄存器来说,在所有的模式下都是指同一个物理寄存器(例如:Usr下的R0与FIQ下的R0是同一个寄存器)。在异常程序中断造成模式切换时,由于不同模式使用的是相同的物理寄存器。这可能导致数据遭到破坏。未备份寄存器没有被系统作为别的用途,任何场合均可采用未备份寄存器。7 @0 E# ^+ c+ [" l
b.备份寄存器,包括R8-R14) b7 r' W5 n+ G4 `6 F; k) t
对于备份寄存器R8-R12来说,除FIQ模式下其它模式均使用相同的物理寄存器。在FIQ模式下R8_fiq,R9_fiq,, f0 N: k+ o' H" y( ]+ x. f0 j
R10_fiq,R11_fiq,R12_fiq。它有自己的物理寄存器。! s- p3 ]6 D6 U. e, x
对于R13和R14寄存器每种模式都有自己的物理寄存器(System与Usr的寄存器相同)当异常中断发生时,系统使用相应模式下的物理寄存器,从而可以避免数据遭到破坏。
$ D" \0 q. R" M# ]. |9 X; F* L. G% d4 ] R13也称为SP堆栈指针。
: {. e. d+ B1 g5 k/ J/ C" i R14也称为LR寄存器
$ `4 ~9 S- @ D* }c.程序计数器,PC% {6 Q# e* O6 @
PC寄存器存储指令地址,由于ARM采用流水机制执行指令,故PC寄存器总是存储下一条指令的地址。# f. p+ N0 ~" h" z' Z0 U: M! q* R
由于ARM是按照字对齐故PC被读取后的值的bit[1:0]总是0b00(thumb的bit[0]是0b0)。 2.程序状态寄存器
9 t, x$ ?9 z2 y' F程序状态寄存器包含当前程序状态寄存器和备份状态寄存器。
2 _7 \; l1 A: Va.CPSR(程序状态寄存器), ` D1 S8 `7 Y2 K. n2 w7 e
CPSR在任何处理器模式下都可以被访问。其结构如下: 31 30 29 28 --- 7 6 - 4 3 2 1 0
2 W' E/ x7 `1 w6 D N Z C V I F M4 M3 M2 M1 M0 N(Negative)、Z(Zero)、C(Carry)以及V(oVerflow)称为条件标志位。ARM指令根据CPSR的条件标志位来选择地执行。 CPSR条件标志位& l" |. H( n- D8 A- B" E
=======================================================================================
/ x: `! L& r; ?$ h# a! h: T, n条件标志位 含义7 m6 Y! Q) A! Y' H
----------------------------------------------------------------------------------------------------------------/ @6 E" s1 n, a) P1 Q
N N=1 表示运算结果为负数,N=0 表示运算结果为正数。 - o, Z$ L8 ?3 l& {# {
Z Z=1 表示运算结果为0, Z=0 表示运算结果为非零。
0 z- U; `& F5 i, T( q- \' PC C=1 表示运算结果产生了进位。4 F( ?* G; Q, t7 ~
V V=1 运算结果的符号位发生了溢出。5 A& i! r1 F4 z0 P# _8 K
Q 在ARMv5 E系列版本中Q=1 表示DSP指令溢出。
# S" [' @" a* U, ^4 v! ] 在ARMv5以前的版本中没有Q标志位。
! J1 [" L% Z2 W+ n# x" W3 `=======================================================================================
' k" d0 R. `) B3 }9 B1 ?- q以下指令会影响CPSR的条件标志位4 D& Z, G2 Z0 q9 [$ t e; ?
(1)比较指令,如: CMP、CMN、TEQ、TST等。
9 M/ Y D' }5 }3 n% Q* t+ I& [(2)当一些算术逻辑运算的目标寄存器不是PC时,这些指令会影响CPSR的条件标志位。" G* T" N8 _, \0 M
(3)MSR与MRS指令可以对CPSR/SPSR进行操作。/ ?% B- s3 |7 `8 I
(4)LDM指令可以将SPSR复制到CPSR中。 CPSR的控制位
6 T9 s! c2 ]& q7 _! G; S/ U" v8 Z=======================================================================================
+ [ F. `7 Q$ s% n# W' I6 \# B控制位 含义
$ ?3 _4 ]0 z5 r+ t4 J: i----------------------------------------------------------------------------------------------------------------) e+ X4 C! [. a$ L% L2 |' W
I I=1 禁用IRO中断3 W) p, H# {3 F2 ~# @" K
F F=1 禁用FIQ中断7 V3 Q: C/ e. n6 e+ W
T ARMv4以上T版本T=0 执行ARM指令,T=1执行Thumb指令。
4 }$ K$ _- G3 [* G9 G' i; e5 k ARMv5以上非T版本T=0 执行ARM指令,T=1表示下一条指令产生未定义指令中断。M[4:0] 控制处理器模式1 ~0 l. l- M; E
0b10000 User
% L* l {9 _: P+ Y) _2 V. t 0b10001 FIQ
, a1 p7 ^% E9 _- ]& K7 P 0b10010 IRQ
r- D) S; H9 _% W Q 0b10011 Supervisor
7 r- `6 M2 t f% v 0b10111 Abort/ ?- T4 K* u' g) h5 X" e1 o0 D
0b11011 Undefined0 W3 e5 w% {, u. l; z
0b11111 System % n7 F; j* W" C; U3 p, g
=======================================================================================7 h, ]+ ` y \8 x
b.SPSR(备份状态寄存器)' m( [: m& T# T+ G
SPSR的结构与CPSR的结构相同,SPSR是用来备份CPSR的。
! Z0 K1 s- Y' y' d& G! s |