原创 ARM寄存器介绍

2009-5-11 13:04 3370 8 9 分类: MCU/ 嵌入式

ARM处理器含有37个寄存器,这些寄存器包括以下两类寄存器。


(1)31个通用寄存器:包括程序计数器PC等,这些寄存器都是32位寄存器。


(2)6个状态寄存器:状态寄存器也是32位的寄存器,但是只使用了其中的12位。


 



1.通用寄存器
在ARM处理器的7种模式下都有一组对应的寄存器组。在任意时刻,可见的寄存器组包括15个通用寄存器R0~R14、一个或两个状态寄存器和PC。在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。详细如表1-3所示。


表1-3 ARM物理寄存器




用户模式



系统模式



特权模式



中止模式



未定义指令模



外部中断模



快速中断模



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类。


n  未备份寄存器:包括R0~R7。


n  备份寄存器:包括R8~R14。


n  程序计数器PC:即R15。


1)未备份寄存器R0~R7



对于每个未备份寄存器来说,在所有的处理器模式下指的都是同一个物理寄存器,在异常中断造成处理器模式切换时,由于不同的处理器模式使用相同的物理寄存
器,可能造成寄存器中数据被破坏。未备份寄存器没有被系统用于特别的用途,任何可采用通用寄存器的应用场合都可以使用未备份寄存器。

2)备份寄存器R8~R14



备份寄存器中的每个寄存器对应于两个不同的物理寄存器。例如,当使用快速中断模式下的寄存器时,寄存器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通常用做堆栈指针。每一种模式都拥有自己的物理R13。程序初始化R13,使其指向该模式专用的栈地址。当进入该模式时,可以将需要使用的寄存器保存在R13所指的栈中,当退出该模式时,将保存在R13所指的栈中的寄存器值弹出。这样就实现了程序的现场保护。

寄存器R14又被称为连接寄存器(LR),在ARM中有下面两种特殊用途。



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



可以通过下面两种方式实现这种子程序的返回操作。



◆执行下面任何一条指令



MOV      pc, LR



BX          LR



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



STMFD  SP!, {registers}, LR}



相应地,下面的指令可以实现子程序的返回:



LDMFD  SP!, { registers}, LR }




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

3)程序计数器PC→R15

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


由于ARM采用了流水线机制,当正确读取了PC的值时,该值为当前指令地址值加8个字节。也就是说,对于ARM指令集来说,PC指向当前指令的下两条指令的地址。由于ARM指令是字对齐的,PC值的第0位和第1位总为0
需要注意的是,当使用指令STRSTM保存R15时,保存的可能是当前指令地址值加8字节,也可能保存的是当前指令地址加12字节。到底是哪种方式,取决于芯片具体设计方式。无论如何,在同一芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不能有些指令采用当前指令地址加8,另一些指令采用当前指令地址加12。因此对于用户来说,尽量避免使用STRSTM指令来保存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地址



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




31



30



29



28



27



26



7



6



5



4



3



21



0



N



Z



C



V



Q



DNMLRAZ



I



F



I



M4



M3



M



M0




 

1)条件标志位



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



CPSR标志位含义




标志位



   



N



本位设置成当前指令运算结果的bit[31]的值


当两个补码表示的有符号整数运算时,N1表示运算的结果为负数,N0 表示结果为正数或零



Z



Z1表示运算结果是0Z0表示运算结果不是零


对于CMP指令,Z1表示进行比较的两个数大小相等



C



在加法指令中(包括比较指令CMN),结果产生进位了,则C1,表示无符号数运算发生上溢出,其他情况下C0


在减法指令中(包括比较指令CMP),结果产生借位了,则C0,表示无符号数运算发生下溢出,其他情况下C1


对于包含移位操作的非加/减法运算指令,C中包含最后一次被溢出的位的数值,对于其他非加/减法运算指令,C位的值通常不受影响



V



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


其他的指令通常不影响V




 



 

2)Q标志位


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

3)CPSR中的控制位



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


① I中断禁止位


当I=1时禁止IRQ中断。


当F=1时禁止FIQ中断。


通常一旦进入中断服务程序可以通过置位I和F来禁止中断,但是在本中断服务程序退出前必须恢复原来I、F位的值。


T控制位,用来控制指令执行的状态,即说明本指令是ARM指令还是Thumb指令。对于不同版本的ARM处理器,T控制位的含义是有些不同的。


对于ARM v3及更低的版本和ARM v4的非T系列版本的处理器,没有ARM和Thumb指令的切换,所以T始终为0。


对于ARM v4及更高版本的T系列处理器,T控制位含义如下。


当T=0,表示执行ARM指令。


当T=1,表示执行Thumb指令。


对于ARM v5及更高的版本的非T系列处理器,T控制位的含义如下。


当T=0表示执行ARM指令。


当T=1表示强制下一条执行的指令产生为定义指令中断。

③ M 控制位


控制位M[4:0]称为处理器模式标识位,具体说明如表1-5所示。



1?5 CPSR
处理器模式位




M[4:0]



处理器模式



可访问的寄存器



0b10000



User



PC,R14~R0,CPSR



0b10001



FIQ



PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq



0b10010



IRQ



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



0b11111



System



PC,R14~R0,CPSR(ARM v4及更高版本)




④CPSR的其他位用于将来ARM版本的扩展,程序可以先不操作这些位。

文章评论1条评论)

登录后参与讨论

yannzi 2009-5-11 13:05

又回来继续学ARM体系结构了,虽然以前有些了解,这次要深入了解!
相关推荐阅读
yannzi 2009-08-14 22:45
C++课程设计指导书之二 媒體庫管理系統
一、課程設計目的l        通過設計、實現媒體庫管理系統,熟悉面向對象的設計思想;l        進一步熟悉、掌握STL中有關類型及其使用方法,泛型編程的風格。二、系統設計要求在這個課程設計中...
yannzi 2009-08-10 16:17
C++课程设计指导书之一 学生考勤管理系统,已添加自己的程序
https://static.assets-stash.eet-china.com/album/old-resources/2009/5/15/cc35849a-1226-4015-829a-f5fe...
yannzi 2009-08-10 11:54
痛苦并快乐着
今天图书馆下了一堆资料,可能是猛过头了,所以用死了两台电脑,还有一台电脑根本开不了机。。。帮同学影印了九章奖状,有机会可以剥削人家一把,影印太费时了。在宿舍,还有工人忙着修宿舍,噪音很吵,就快开始看资...
yannzi 2009-08-09 22:21
实用软件介绍 (Q-Dir、UE编辑器、Beyond Compare)
Q-Dir 3.93http://www.onlinedown.net/soft/66200.htmUltraEdit-32 (文本编辑器)http://www.orsoon.com/Soft/780...
yannzi 2009-08-09 22:09
实习第8天
      昨天也没什么好写的,就这样跳过了,都是自己在看一些有关嵌入式的视频。      原本今天也没什么好写的,倒数第二天了,发现有些东西还是挺人性化的,比如不用现在就把电脑还了之类的,要不然还真...
yannzi 2009-08-09 22:08
实习第6天
       这天吃了早餐来到公司,过了半个钟,就退还了两本Windows相关的编程书,放弃MFC相关的编程了,然后再借了两本与嵌入式有关的书。       就这样开始一天的读书之旅。看来要开始准备辞...
我要评论
1
8
关闭 站长推荐上一条 /2 下一条