当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。表3.2显示了ARM的寄存器组织概要。

3.3 ARM寄存器组织

ARM处理器有37个32位长的寄存器。

· 1个用作PC(Program Counter)。

· 1个用作CPSR(Current Program Status Register)。

· 5个用作SPSR(Saved Program Status Registers)。

· 30个用作通用寄存器。

注意

以上37个寄存器中,1个CPSR和5个SPSR通称为状态寄存器,虽然这些寄存器是32位的,但目前只使用了其中的12位。除了这6个状态寄存器外,其余的31个寄存器又称为通用寄存器。

ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组相应的寄存器组。表3.2显示了ARM的寄存器组织概要。

表3.2 寄存器组织概要

User

FIQ

IRQ

SVC

Undef

Abort

R0

User mode
R0~R7,R15,and CPSR

User mode
R0~R12,R15

and CPSR

User mode
R0~R12,R15

and CPSR

User mode R0~R12,R15

and CPSR

User mode R0~R12,R15

and CPSR

R1

R2

R3

R4

R5

R6

R7

R8

R8

R9

R9

R10

R10

续表

User

FIQ

IRQ

SVC

Undef

Abort

R11

R11

R12

R12

R13(SP)

R13(SP)

R13

R13

R13

R13

R14(LR)

R14(LR)

R14

R14

R14

R14

R15(PC)

CPSR

SPSR

SPSR

SPSR

SPSR

SPSR

注意

System模式使用和User模式相同的寄存器集

当前处理器的模式决定着哪组寄存器可操作,任何模式都可以存取。

· 相应的r0~r12。

· 相应的r13(the stack pointer, sp)和r14(the link register, lr)。

· 相应的r15(the program counter, pc)。

· 相应的CPSR(current program status register, cpsr)。

特权模式(除System模式)还可以存取。

· 相应的SPSR(saved program status register)。

3.3.1 通用寄存器

通用寄存器根据其分组与否和使用目的分为以下3类。

· 未分组寄存器(The unbanked registers),包括r0~r7。

· 分组寄存器(The banked register),包括r8~r14。

· 程序计数器(Program Counter),即r15。

1.未分组寄存器

未分组寄存器包括r0~r7。顾名思义,在所有处理器模式下对于每一个未分组寄存器来说,指的都是同一个物理寄存器。未分组寄存器没有被系统用于特殊的用途,任何可采用通用寄存器的应用场合都可以使用未分组寄存器。但由于其通用性,在异常中断所引起的处理器模式切换时,其使用的是相同的物理寄存器,所以也就很容易使寄存器中的数据被破坏。

2. 分组寄存器

r8~r14是分组寄存器,它们每一个访问的物理寄存器取决于当前的处理器模式。

对于这些分组寄存器r8~r12来说,每个寄存器对应两个不同的物理寄存器。一组用于除FIQ模式外的所有处理器模式,而另一组则专门用于FIQ模式。这样的结构设计有利于加快FIQ的处理速度。不同模式下寄存器的使用,要使用寄存器名后缀加以区分,例如,当使用FIQ模式下的寄存器时,寄存器r8和寄存器r9分别记做r8_fiq, r9_fiq;当使用用户模式下的寄存器时,寄存器r8和r9分别记做r8_usr, r9_usr等。在ARM体系结构中,r8~r12没有任何指定的其他的用途,所以当FIQ中断到达时,不用保存这些通用寄存器,也就是说FIQ处理程序可以不必执行保存和恢复中断现场的指令,从而可以使中断处理过程非常迅速。所以FIQ模式常被用来处理一些时间紧急的任务,如DMA处理。

对于分组寄存器r13和r14来说,每个寄存器对应6个不同的物理寄存器。其中的一个是用户模式和系统模式公用的,而另外5个分别用于5种异常模式。访问时需要指定它们的模式。名字形式如下:

· r13_<mode>

· r14_<mode>

其中<mode>可以是以下几种模式之一:usr、svc、abt、und、irp及fiq。

r13寄存器在ARM中常用作堆栈指针,称为SP。当然,这只是一种习惯用法,并没有任何指令强制性的使用r13作为堆栈指针,用户完全可以使用其他寄存器作为堆栈指针。而在Thumb指令集中,有一些指令强制性的将r13作为堆栈指针,如堆栈操作指令。

每一种异常模式拥有自己的r13。异常处理程序负责初始化自己的r13,使其指向该异常模式专用的栈地址。在异常处理程序入口处,将用到的其他寄存器的值保存在堆栈中,返回时,重新将这些值加载到寄存器。通过这种保护程序现场的方法,异常不会破坏被其中断的程序现场。

寄存器r14又被称为连接寄存器(Link Register,LR),在ARM体系结构中具有下面两种特殊的作用。

(1)每一种处理器模式用自己的r14存放当前子程序的返回地址。当通过BL或BLX指令调用子程序时,r14被设置成该子程序的返回地址。在子程序返回时,把r14的值复制到程序计数器PC。典型的做法是使用下列两种方法之一。

· 执行下面任何一条指令。

MOV PC, LR

BX LR

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

STMFD SP!, {<register>,LR}

在子程序返回时,使用如下相应的配套指令返回。

LDMFD SP!, {<register>,PC}

(2)当异常中断发生时,该异常模式特定的物理寄存器r14被设置成该异常模式的返回地址,对于有些模式r14的值可能与返回地址有一个常数的偏移量(如数据异常使用SUB PC, LR,#8返回)。具体的返回方式与上面的子程序返回方式基本相同,但使用的指令稍微有些不同,以保证当异常出现时正在执行的程序的状态被完整保存。

R14也可以被用作通用寄存器使用。

注意

当嵌套中断被允许时(即异常可重入),r13和r14的使用要特别小心。例如,在用户模式下一个IRQ中断发生,这时两种模式分别使用不同的r13和r14,换句话讲,用户模式使用r13_usr和r14_usr,而IRQ模式使用r13_irq和r14_irq,这样不会造成寄存器使用冲突。但是,当程序运行在IRQ模式下,又有IRQ中断进入,此时,第二级中断使用r13_irq和r14_irq,冲掉了第一级IRQ的堆栈指针和返回地址,导致程序异常。

解决办法是在第二级中断发生前,将第一级中断用到的寄存器压栈。

3.3.2 程序计数器r15

程序计算器r15又被记为PC。它有时可以被和r0-r14一样用作通用寄存器,但很多特殊的指令在使用r15时有些限制。当违反了这些指令的使用限制时,指令的执行结果是不可预知的。

程序计数器在下面两种情况下用于特殊的目的。

· 读程序计数器。

· 写程序计数器。

1.程序计数器读操作

由于ARM的流水线机制,指令读出的r15的值是指令地址加上8个字节。由于ARM指令始终是字对齐的,所以读出的结果位[1∶0]始终是0(但在Thumb状态下,指令为2字节对齐,bit[0]=0)。

读PC主要用于快速地对临近的指令或数据进行位置无关寻址,包括程序中的位置无关分支。

需要注意的是,当使用指令STR或STM对r15进行保存时,保存的可能是当前指令地址加8或当前指令地址加12。到底是哪种方式,取决于芯片的具体设计方式。当然,在同一个芯片中,要么采用当前指令地址加8,要么采用当前指令地址加12,不可能有些指令采用当前地址加8,有些采用当前地址加12。程序开发人员应尽量避免使用STR或STM指令来对r15进行操作。当不可避免要使用这种方式时,可以先通过一小段程序来确定所使用的芯片是使用哪种方式实现的。例如:

SUB R1,PC,#4 ;r1中存放STR指令地址

STR PC,[R0] ;将PC=STR地址+offset保存到r0中

LDR R0,[R0]

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

2.程序计数器写操作

当指令向r15写入地址数据时,如果指令成功返回,它将使程序跳转到该地址执行。由于ARM指令是字对齐的,写入r15的地址值应满足bit[1:0]=0b00,具体的规则根据ARM版本的不同也有所不同:

· 对于ARM版本3以及更低的版本,写入r15的地址值bit[1:0]被忽略,即写入r15的地址值将与0xFFFFFFFC做与操作。

· 对于ARM版本4以及更高的版本,程序必须保证写入r15寄存器的地址值的bit[1:0]为0b00,否则将会产生不可预知的结果。

对于Thumb指令集来说,指令是半字对齐的。处理器将忽略bit[0],即写入r15寄存器的值在写入前要先和0XFFFFFFFE做与操作。

有些指令对r15的操作有特殊的要求。比如,指令BX利用bit[0]来确定需要跳转到的子程序是ARM状态还是Thumb状态。

注意

这种读取PC值和写入PC值的不对称操作需要特别注意。

3.3.3 程序状态寄存器

当前程序状态寄存器CPSR(Current Program Status Register)可以在任何处理器模式下被访问,它包含下列内容。

· ALU(Arithmetic Logic Unit)状态标志的备份。

· 当前的处理器模式。

· 中断使能标志。

· 设置处理器的状态(只在4T架构)。

每一种处理器模式下都有一个专用的物理寄存器作备份程序状态寄存器SPSR(Saved Program Status Register)。当特定的异常中断发生时,这个物理寄存器负责存放当前程序状态寄存器的内容。当异常处理程序返回时,再将其内容恢复到当前程序状态寄存器。

注意

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

CPSR寄存器(和保存它的SPSR寄存器)中的位分配如图3.4所示。

图3.4 程序状态寄存器格式

1.标志位

N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)通称为条件标志位。这些条件标志位会根据程序中的算术或逻辑指令的执行结果进行修改,而且这些条件标志位可由大多数指令检测以决定指令是否执行。

在ARM 4T架构中,所有的ARM指令都可以条件执行,而Thumb指令却不能。

各条件标志位的具体含义如下。

· N

本位设置成当前指令运行结果的bit[31]的值。当两个由补码表示的有符号整数运算时,N=1表示运算的结果为负数;N=0表示结果为正数或零。

· Z

Z=1表示运算的结果为零,Z=0表示运算的结果不为零。

注意

对于CMP指令,Z=1表示进行比较的两个数相等。

· C

下面分4种情况讨论C的设置方法。

① 在加法指令中(包括比较指令CMN),当结果产生了进位,则C=1,表示无符号数运算发生上溢出;其他情况下C=0。

② 在减法指令中(包括比较指令CMP),当运算中发生错位(即无符号数运算发生下溢出),则C=0,;其他情况下C=1。

③ 对于在操作数中包含移位操作的运算指令(非加/减法指令),C被设置成被移位寄存器最后移出去的位。

④ 对于其他非加/减法运算指令,C的值通常不受影响。

· V

下面分两种情况讨论V的设置方法。

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

② 对于非加/减法指令,通常不改变标志位V的值(具体可参照ARM指令手册)。

尽管以上C和V的定义看起来颇为复杂,但使用时在大多数情况下用一个简单的条件测试指令即可,不需要程序员计算出条件码的精确值即可得到需要的结果。

注意

下面两种情况会对CPSR的条件标志位产生影响。

1.比较指令(CMN、CMP、TEQ、TST)。

2.目的寄存器不是r15的算术逻辑运算和数据传输指令。这些指令可以通过在指令末尾加标志“S”来通知处理器指令的执行结果影响标志位。

【例3.2】

使用SUBS指令从寄存器r1中减去常量1,然后把结果写回到r1,其中CPSR的Z位将受到影响。

指令执行前:

CPSR中Z=0

r1=0x00000001

SUBS r1,r1,#1

SUB指令执行结束后:

r1=0x0

CPSR中Z=1

目的寄存器是r15的带“位设置”的算术和逻辑运算指令,也可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。

用MSR指令向CPSR/SPSR写进新值。

目的寄存器位r15的MRC协处理器指令通过这条指令可以将协处理器产生的条件标志位的值传送到ARM处理器。

在中断返回时,使用LDR指令的变种指令可以将SPSR的值复制到CPSR中。

2.Q标志位

在带DSP指令扩展的ARM v5及更高版本中,bit[27]被指定用于指示增强的DAP指令是否发生了溢出,因此也就被称为Q标志位。同样,在SPSR中bit[27]也被称为Q标志位,用于在异常中断发生时保存和恢复CPSR中的Q标志位。

在ARM v5以前的版本及ARM v5的非E系列处理器中,Q标志位没有被定义。属于待扩展的位。

3.控制位

CPSR的低8位(I、F、T及M[4∶0])统称为控制位。当异常发生时,这些位的值将发生相应的变化。另外,如果在特权模式下,也可以通过软件编程来修改这些位的值。

① 中断禁止位

I=1,IRQ被禁止。

F=1,FIQ被禁止。

② 状态控制位

T位是处理器的状态控制位。

T=0,处理器处于ARM状态(即正在执行32位的ARM指令)。

T=1,处理器处于Thumb状态(即正在执行16位的Thumb指令)。

当然,T位只有在T系列的ARM处理器上才有效,在非T系列的ARM版本中,T位将始终为0。

③ 模式控制位

M[4∶0]作为位模式控制位,这些位的组合确定了处理器处于哪种状态。表3.3列出了其具体含义。

只有表中列出的组合是有效的,其他组合无效。

表3.3 状态控制位M[4∶0]

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及更高版本)

注意

由于用户模式(User)和系统模式(System)是非异常模式,所以没有单独的SPSR保存程序状态字。在用户模式或系统模式下,读SPSR将返回一个不可预知的值,而写SPSR将被忽略。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭