• ARM 37 个通用寄存器详解


    一、简介

    1、ARM 总共有 37 个寄存器,但是每种模式下最多只能看到 18 个寄存器,其他寄存器虽然名字相同,但是在当前模式不可见。
    2、例如,对 r13 这个名字来说,在 ARM 中共有 6 个名叫 r13(又叫 sp)的寄存器,但是在每种特定处理器模式下,只有一个 r13 是当前可见的,其他的 r13 必须切换到它们的对应模式下才能看到。这种设计叫影子寄存器(banked register)。
    3、这 37 个寄存器的地址都是不一样的,虽然它们可以有相同的名字。同时,有些寄存器甚至还有别名,比如在汇编代码中,r15 寄存器也写作 pc 寄存器。

    在这里插入图片描述


    二、CPU 通用寄存器的切换示意图

    1、

    当前处在 User 用户模式 下,可以看到所有 r0 ~ r15 寄存器、以及 cpsr 寄存器。

    在这里插入图片描述


    2、

    某一时刻,CPU 切换到 FIQ 模式。此时, 寄存器列表中的 r8 ~ r14 寄存器将是属于 FIQ 模式自身的寄存器,这几个 r8 ~ r14 寄存器,与 User 模式的 r8 ~ r14 寄存器是不同的寄存器,只是名字相同。

    并且,FIQ 模式下的 spsr 寄存器将会保存 User 模式下的 cpsr 寄存器的状态;等到切换回 User 模式的时候, spsr 寄存器就会将它保存的值,赋值给 User 模式下的 cpsr 寄存器,实现恢复的效果。

    同理,其他任何一种模式切换的动作,都是类似的。 在这里插入图片描述


    3、

    回到用户模式下。

    在这里插入图片描述


    4、

    User 模式切换到 IRQ 模式

    在这里插入图片描述


    5、

    回到用户模式下。

    在这里插入图片描述


    6、

    User 模式切换到 SVC 模式

    在这里插入图片描述


    7、

    回到用户模式下。

    在这里插入图片描述


    8、

    User 模式切换到 Undef 模式

    在这里插入图片描述


    9、

    回到用户模式下。

    在这里插入图片描述


    10、

    User 模式切换到 Abort 模式

    在这里插入图片描述


    11、

    回到用户模式下。

    在这里插入图片描述


    12、

    下图是 CPU 各种工作模式切换过程的 寄存器变化 示意图,图中写清楚了:各种工作模式下都会使用到 User mode 中使用的寄存器。

    • 对于 sp(栈指针寄存器)和 lr (链接寄存器,用于函数返回),每一种模式都会有属于自己的栈空间,因此每个模式都需要属于自己的 sp(栈指针寄存器),用于恢复和保存自身工作模式下的栈空间现场;同理,每个工作模式都会有属于自己的 lr 寄存器,比如 IRQ 模式下进行了函数调用,IRQ 模式的 lr 寄存器用于保存 IRQ 模式进行函数调用时的返回地址,当函数调用执行结束后,回到被调用的地址处,继续往下执行 IRQ 模式下的剩余代码。
    • spsr 寄存器用于保存和恢复 cpsr 寄存器的值。当处于 User 模式时,User 模式拥有一个 cpsr 寄存器的值。某个时刻,从 User 模式切换到 IRQ 模式,IRQ 模式使用和 User 模式同一个 cpsr 寄存器,此时需要用 IRQ 模式的 spsr 寄存器保存属于 User 模式的 cpsr 寄存器的值。这样,当从 IRQ 模式退出返回到 User 模式时, IRQ 模式的 spsr 寄存器就可以把 User 模式的 cpsr 寄存器值恢复回去。
    • 注意:System 模式使用 User 模式寄存器集。

    在这里插入图片描述


    归纳

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

    在这里插入图片描述

    通用寄存器可以分为下面 3 类:

    • 未备份寄存器( Unbanked Registers ),包括 R0~R7。
    • 备份寄存器( Banked Registers ),包括 R8~R14。
    • 程序计数器 PC,即 R15。
    1. 未备份寄存器

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

    2. 备份寄存器

    对于备份寄存器 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、irg 及 fiq。

    寄存器 R13 在 ARM 中常用作栈指针。在 ARM 指令集中,这只是一种习惯的用法,并没有任何指令强制性地使用 R13 作为栈指针,用户也可以使用其他的寄存器作为栈指针;而在 Thumb 指令集中,有一些指令强制性地使用 R13 作为栈指针。

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

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

    (1) 每一种处理器模式自己的物理 R14 中存放着当前子程序的返回地址当通过 BL 或 BLX 指令调用子程序时,R14 被设置成该子程序的返回地址。在子程序中,当把 R14 的值复制到程序计数器PC中时,子程序即返回。可以通过下面两种方式实现这种子程序的返回操作。

    ① 执行下面任何一条指令:

    MOV PC, LR
    BX   LR
    
    • 1
    • 2

    (2) 当异常中断发生时,该异常模式特定的物理 R14 被设置成该异常模式将要返回的地址,对于有些异常模式,R14 的值可能与将返回的地址有一个常数的偏移量。R14 寄存器也可以作为通用寄存器使用。

    3. 程序计数器 R15

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

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


    总结

    • ARM 共有 37个寄存器,都是 32 位长度。
    • 37 个寄存器中 30 个为“通用”型,1 个固定用作 PC,一个固定用作 CPSR,5 个固定用作 5 种异常模式下的 SPSR。
    • 上述的 30 个为“通用”型,是指这 30 个寄存器区别于后面的寄存器:PC 寄存器固定只能是 r15 寄存器,不能将其他寄存器作为 PC 寄存器使用; CPSR 和 SPSR 寄存器也是固定的,不能将其他寄存器作为 PC 寄存器使用。

    三、CPSR程序状态寄存器

    CPSR(当前程序状态寄存器) 可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位、当前处理器模式标志以及其他的一些控制和状态位。每一种处理器模式下都有一个专用的物理状态寄存器,称为SPSR(备份程序状态寄存器)。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPSR中保存的值来恢复CPSR。

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

    CPSR的格式如下所示。SPSR格式与CPSR格式相同

    在这里插入图片描述


    1 、条件标志位

    N(Negative)、Z(Zero)、C(Carry)及V(oVerflow)统称为条件标志位。大部分的ARM指令可以根据CPSR中的这些条件标志位来选择性地执行。各条件标志位的具体含义如表1.5所示。
    在这里插入图片描述
    以下指令会影响CPSR中的条件标志位:

    • 比较指令,如CMP、CMN、TEQ及TST等。
    • 当一些算术运算指令和逻辑指令的目标寄存器不是R15时,这些指令会影响CPSR中的条件标志位。
    • MSR指令可以向CPSR/SPSR中写入新值。
    • MRC指令将R15作为目标寄存器时,可以把协处理器产生的条件标志位的值传送到ARM处理器。
    • 一些LDM指令的变种指令可以将SPSR的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。
    • 一些带“位设置”的算术和逻辑指令的变种指令,也可以将SPS的值复制到CPSR中,这种操作主要用于从异常中断程序中返回。

    2、CPSR中的控制位

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

    (1) 中断禁止位
    ① 当 I=1 时禁止IRQ中断。
    ② 当 F=1 时禁止FIQ中断。

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

    对于ARMv3以及更低的版本和ARMv4的非T系列版本的处理器,没有ARM状态和Thumb状态切换,T控制位应为0。

    对于ARMv4以及更高的版本的T系列的ARM处理器,T控制位的含义如下。
    ①T=0表示执行ARM指令。
    ②T=1表示执行Thumb指令。
    对于ARMv5以及更高的版本的非T系列的ARM处理器,T控制位的含义如下。
    ①T=0表示执行ARM指令。
    ②T=1表示强制下一条执行的指令产生未定义指令中断。

    (3) M 控制位
    控制位 M[4:0] 控制处理器模式,具体含义如表1.6所示。
    在这里插入图片描述

    3、注意

    • CPSR中各个bit位表明了CPU的某些状态信息,这些信息非常重要,和后面学到的汇编指令息息相关(譬如BLE指令中的E就和CPSR中的Z标志位有关);
    • CPSR中的 I、F位和开中断、关中断有关;
    • CPSR中的mode位 (bit4~bit0共5位) 决定了CPU的工作模式,在uboot代码中会使用汇编进行设置;

    四、PC(r15)程序控制寄存器

    • PC(Program control register)为程序指针,PC 指向哪里,CPU 就会执行哪条指令(所以程序跳转时就是把目标地址代码放到 PC 中);
    • 整个 CPU 中只有一个 PC(CPSR 也只有一个,但 SPSR 有 5 个);

    B站朱友鹏老师.

  • 相关阅读:
    uniapp主题切换功能的方式终结篇(全平台兼容)
    win11系统影响玩游戏吗?适合玩游戏吗?
    剑指offer 14. 二进制中1的个数
    Webmin--System and Server Status模块
    Javascript 笔记:object
    赶紧收藏!2024 年最常见 20道 Kafka面试题(三)
    iPhone 14,要来了
    移动端测试——移动端App抓包
    day7-numpy基础学习
    素数(埃式筛法、线性筛法)
  • 原文地址:https://blog.csdn.net/weixin_42109053/article/details/128055828