ARM寄存器组织

这篇具有很好参考价值的文章主要介绍了ARM寄存器组织。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ARM寄存器组织

 ARM有37个32位长的寄存器:

1个用做PC(Program Counter);

1个用做CPSR(Current Program Status Register);

5个用做SPSR(Saved Program Status Registers);

30个通用寄存器。

ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,虽然均为32位,但目前只使用了其中的一部分。同时,ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下,可访问的寄存器包括15个通用寄存器(R0~R14)、一至两个状态寄存器和程序计数器。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。

ARM寄存器组织
ARM的寄存器组织概要

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

相应的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,SPSR)。

通用寄存器

通用寄存器根据其分组与否和使用目的分为未分组寄存器、分组寄存器和程序计数器3类。

(1)未分组寄存器(the unbanked registers)

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

(2)分组寄存器(the banked registers)

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体系结构中具有以下两种特殊的作用。

① 每一种处理器模式均用自己的r14存放当前子程序返回地址。当通过BL或BLX指令调用子程序时,r14被设置成该子程序的返回地址。在子程序返回时,把r14的值复制到程序计数器PC。典型的做法是执行下面任何一条指令:

MOV  PC,LR
BX  LR

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

STMFD  SP!,{<register>,LR}

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

LDMFD  SP!,{<register>,PC}

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

r14也可以被用做通用寄存器。

(3)程序计数器(Program Counter)

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

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

① 程序计数器读操作。由于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进行操作。

② 程序计数器写操作。当指令向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状态。

程序状态寄存器

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

① ALU(Arithmetic Logic Unit)状态标志的备份;

② 当前的处理器模式;

③ 中断使能标志;

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

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

CPSR寄存器(和保存它的SPSR寄存器)中的位分配如图:

ARM寄存器组织

 (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,表示运算的结果不为零。

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

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

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

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

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

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

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

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

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

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

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

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

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

例:

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

SUBS指令执行前:

        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指令的变种。在中断返回时,使用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显示了其具体含义。只有表中列出的组合是有效的,其他组合无效。

ARM寄存器组织文章来源地址https://www.toymoban.com/news/detail-429964.html

到了这里,关于ARM寄存器组织的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM 寄存器

    Cortex A 系列的 ARM 处理器共有 40 个 32 位寄存器,其中 33 个为通用寄存器,7 个为状态寄存器。用户模式和系统模式共用同一组寄存器。 一、未分组寄存器 R0~R7 有些寄存器是所有运行模式共用的,如 R0~R7,它们被称为未分组寄存器。 在所有运行模式下,未分组寄存器都指向同

    2024年02月02日
    浏览(48)
  • ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

    快速学习嵌入式开发其他基础知识? 返回专栏总目录 《嵌入式工程师自我修养/C语言》 Tip📌:鼠标悬停双虚线/句,可获得更详细的描述   ARM处理器有多种工作模式,如下表所示。应用程序正常运行时,ARM处理器工作在 用户模式(User mode) ,当程序运行出错或有中

    2024年02月21日
    浏览(133)
  • ARM中的寄存器

    ARM工作模式 ARM有8个基本的工作模式 User 非特权模式,一般在执行上层的应用程序时ARM处于该模式 FIQ 当一个高优先级中断产生后ARM将进入这种模式 IRQ 当一个低优先级中断产生后ARM将进入这种模式 SVC 当复位或执行软中断指令后ARM将进入这种模式 Abort 当产生存取异常时ARM将进

    2024年02月03日
    浏览(43)
  • ARM架构(寄存器点灯)

    本篇文章我们来讲解一下如何使用寄存器点亮一个LED灯,一般对于新人来说都是使用HAL库或者标准库来操作的,但是学习寄存器有助于我们了解更加深入的知识,这加会提高我们对ARM架构的理解。 首先第一步我们需要先找到LED的原理图,确定对应的引脚,然后知道是高电平点

    2024年02月15日
    浏览(61)
  • ARM编程模型-寄存器组

    Cortex A系列ARM处理器共有40个32位寄存器,其中33个为通用寄存器,7个为状态寄存器。usr模式和sys模式共用同一组寄存器。 通用寄存器包括R0~R15,可以分为3类: 未分组寄存器R0~R7 分组寄存器R8~R14、R13(SP) 、R14(LR) 程序计数器PC(R15)、R8_fiq-R12_fir为快中断独有 在不同模式下,名称相同的

    2024年02月10日
    浏览(50)
  • ARM64 寄存器、常用汇编指令收集

    ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。 寄存器 位数 描述 x0-x30 64bit 通用寄存器,如果有需要可以当做32bit使用:WO-W30 FP(x29) 64bit 保存栈帧地址(栈底指针) LR(x30) 64bit 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 SP 64bit 保存栈指针,使用

    2023年04月20日
    浏览(44)
  • ARM汇编寄存器和常用指令详解

    对于32位及其以下的ARM处理器来说,函数调用规则如下: 父函数与子函数的入口参数以此通过 R0~R3 这4个寄存器传递。 父函数在调用子函数前先将子函数入口参数存入 R0~R3 寄存器中,若只有一个入口参数则使用 R0 寄存器传递,若有2个入口参数则使用 R0 和 R1 寄存器传递,以

    2024年02月03日
    浏览(54)
  • 【ARM】——当前程序状态寄存器 CPSR

    Current Program Status Register 即 CPSR,当前程序状态寄存器,可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位,当前处理器模式标志以及其他的一些控制和状态位。 除了 usr 和 sys 模式外,每一种处理器模式下都有一个专用的物理寄存器,称为 SPSR(备份程序状态寄

    2024年02月03日
    浏览(49)
  • optee读取Arm系统寄存器的模板

    快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 联系方式-加入交流群 ---- 联系方式-加入交流群 先写一个通用的内联函数模板,然后再通过宏控来定义各种读写函数。

    2024年02月12日
    浏览(69)
  • 【ARM Coresight 系列文章 2.3 - Coresight 寄存器】

    请阅读 【ARM Coresight SoC-400/SoC-600 专栏导读】 下篇文章:【ARM Coresight 系列文章 2.4 - Coresight 寄存器:DEVARCH,DEVID, DEVTYPE】 上篇文章:【ARM Coresight 系列文章 2.2- ATB 总线简介】 Coresight 对于每个 coresight 组件,规定了一些寄存器,这些寄存器的偏移是固定的,这些寄存器有的是

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包