ARM中所有寄存器都是32位的。这里以cortex-a7内核的MX6ULL处理器为例,按照功能可以分为两类:运行需要寄存器(程序正常运行所需要的,比如变量暂存,pc制作等,总共43个),系统管理控制寄存器(存在于协处理器cp15的16个寄存器,用于mmu存储管理控制,cache控制,中断控制,浮点运算单元FPU等功能)。因此cortex-a7内核总的有59个寄存器

1. 运行需要寄存器

ARM 处理器共有 9不同的处理器运行模式:
用户模式(User),快速中断模式(FIQ),普通外部中断模式(IRQ),超级管理模式(Svc,裸机就是跑的这个模式,cpu复位也是这个模式),数据访问中止模式(Abort),未定义指令中止模式(Und),系统模式(Sys),监视模式(Mon),超级监视模式(Hyp)

当某个触发满足了,arm自动进入那个模式,比如外部中断来了,arm自动跳转进入IRQ_Handler向量地址,这时候就是自动进入了IRQ模式(在下面介绍的CPSR状态寄存器对应的位可以查询知道当前所处模式,确实改变了)。

除了用户模式,其它所有模式都是特权模式,如果跑了OS,大多数的程序都运行在用户模式,用户模式下是不能访问系统所有资源的,而且不能修改某些资源(比如程序状态寄存器CPSR只能被访问,不能被修改,而该寄存器低5位表示CPU运行模式状态,因此用户模式没法直接发生运行模式切换,保障了系统安全,比如用户模式不能直接开关某某中断),有些资源是受限的,要想访问这些资源,就必须发生模式切换,只能是通过借助异常(比如SWI软中断,将进入SVC模式)来完成模式切换,当要切换模式的时候,应用程序可以产生异常,在异常的处理过程中完成处理器模式切换。

任意一种模式都可以运行程序,因此每种模式,按原则来说会有自己的一组寄存器来实现代码运行,但是有些寄存器是共用的,有些是仅自己用的(从物理上的寄存器不同)。如下图所示(只画出了7种运行模式):

上面可以看出系统模式用户模式,都是正常模式,完全共用寄存器组,而其它模式都属于异常模式。

总结一下,CortexA 内核运行所需寄存器组成如下:
①、34 个通用寄存器,包括 R15 程序计数器(PC),这些寄存器都是 32 位的。
②、8 个状态寄存器,包括 CPSR 和 SPSR。
③、Hyp 模式下独有一个 ELR_Hyp 寄存器。

注:Thumb 程序中(arm指令集的一个子集,大大的节省了系统的存储空间,不是一个完整的体系结构,不能指望处理器只执行thumb指令集而不支持arm指令集),通常只能使用 r4~r7 来保存局部变量。

r12:内部程序调用暂存寄存器,也成为ip寄存器,我不知道是干嘛的,网上解释也模棱两可。

r13:栈指针,也称为sp寄存器

r14:连接寄存器,也称为lr寄存器,程序跳转(子程序调用,中断跳转)后,arm自动在该寄存器中存入原程序(未跳转)的下一条指令的地址

r15:程序计数器,也称为pc寄存器,保存的是当前正在取指的指令的地址(arm采用2级流水线,因此是当前正在执行指令的地址+8)。

除了上述每种模式所需寄存器外,还有6状态寄存器,最主要的就是两个CPSR和SPSR,arm进入异常模式后,SPSR自动保存进入异常前的CPSR的值,以便异常返回后恢复异常发生时的工作状态。因此主要看CPSR中的位都是什么作用:

常用于MRSMSR指令,用于spsr中的值转移到寄存器或把寄存器的内容加载到spsr中,如:

mrs r0, spsr                /* 读取spsr寄存器 */

msr spsr_cxsf, r0            /* 恢复spsr */

2. 系统管理控制寄存器

关 于 CP15 协处理 器和其 相关寄存 器的详细 内容 请参考下 面两份文 档:《ARM 
ArchitectureReference Manual ARMv7-A and ARMv7-R edition.pdf》第 1469 页“B3.17 Oranization of the CP15 registers in a VMSA implementation”。《Cortex-A7 Technical ReferenceManua.pdf》第55 页“Capter 4 System Control”。
CP15 协处理器一般用于存储系统管理,但是在中断中也会使用到,CP15 协处理器一共有
16 个 32 位寄存器。CP15 协处理器的访问通过如下另个指令完成:
MRC: 将 CP15 协处理器中的寄存器数据读到 ARM 寄存器中。
MCR: 将 ARM 寄存器的数据写入到 CP15 协处理器寄存器中。

MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>

这个指令很难理解,还好的是所有控制寄存器,官方文档给出了库函数(通过c语言中嵌入汇编实现的),例如:

/* C语言实现MCR指令 */
#define __MCR(coproc, opcode_1, src, CRn, CRm, opcode_2)                          \
    __ASM volatile ("MCR " __STRINGIFY(p##coproc) ", " __STRINGIFY(opcode_1) ", " \
                    "%0, " __STRINGIFY(c##CRn) ", " __STRINGIFY(c##CRm) ", "      \
                    __STRINGIFY(opcode_2)                                         \
                    : : "r" (src) )

/*******************************************************************************
 *                   CP15 访问函数
 ******************************************************************************/

FORCEDINLINE __STATIC_INLINE uint32_t __get_SCTLR(void)
{
  return __MRC(15, 0, 1, 0, 0);
}

FORCEDINLINE __STATIC_INLINE void __set_SCTLR(uint32_t sctlr)
{
  __MCR(15, 0, sctlr, 1, 0, 0);
}

我学的是正点原子的MX6ULL教程,上述不知道是原子自己写的还是官方SDK里面都有的,在正点原子工程的imx6ul/core_ca7.h文件里,此外里面还有读取cpsr等寄存器的函数,非常方便。

其中比较重要的是,cp15的SCTLR寄存器

/* CP15的SCTLR寄存器 * 参考资料:Cortex-A7 Technical ReferenceManua.pdf P105*/typedef union{struct{uint32_t M:1;                        /*!< bit:     0  MMU enable */uint32_t A:1;                        /*!< bit:     1  Alignment check enable */uint32_t C:1;                        /*!< bit:     2  Cache enable */uint32_t _reserved0:2;               /*!< bit: 3.. 4  Reserved */uint32_t CP15BEN:1;                  /*!< bit:     5  CP15 barrier enable */uint32_t _reserved1:1;               /*!< bit:     6  Reserved */uint32_t B:1;                        /*!< bit:     7  Endianness model */uint32_t _reserved2:2;               /*!< bit: 8.. 9  Reserved */uint32_t SW:1;                       /*!< bit:    10  SWP and SWPB enable */uint32_t Z:1;                        /*!< bit:    11  Branch prediction enable */uint32_t I:1;                        /*!< bit:    12  Instruction cache enable */uint32_t V:1;                        /*!< bit:    13  Vectors bit */uint32_t RR:1;                       /*!< bit:    14  Round Robin select */uint32_t _reserved3:2;               /*!< bit:15..16  Reserved */uint32_t HA:1;                       /*!< bit:    17  Hardware Access flag enable */uint32_t _reserved4:1;               /*!< bit:    18  Reserved */uint32_t WXN:1;                      /*!< bit:    19  Write permission implies XN */uint32_t UWXN:1;                     /*!< bit:    20  Unprivileged write permission implies PL1 XN */uint32_t FI:1;                       /*!< bit:    21  Fast interrupts configuration enable */uint32_t U:1;                        /*!< bit:    22  Alignment model */uint32_t _reserved5:1;               /*!< bit:    23  Reserved */uint32_t VE:1;                       /*!< bit:    24  Interrupt Vectors Enable */uint32_t EE:1;                       /*!< bit:    25  Exception Endianness */uint32_t _reserved6:1;               /*!< bit:    26  Reserved */uint32_t NMFI:1;                     /*!< bit:    27  Non-maskable FIQ (NMFI) support */uint32_t TRE:1;                      /*!< bit:    28  TEX remap enable. */uint32_t AFE:1;                      /*!< bit:    29  Access flag enable */uint32_t TE:1;                       /*!< bit:    30  Thumb Exception enable */uint32_t _reserved7:1;               /*!< bit:    31  Reserved */} b;                                   /*!< Structure used for bit  access */uint32_t w;                            /*!< Type      used for word access */} SCTLR_Type;

还有FPU的3个相关寄存器:NSACR、CPACR、FPEXC寄存器

arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍相关推荐

  1. ARM处理器运行模式

    ARM处理器运行模式 1.ARM处理器有7种运行模式: 1)用户模式 2)特权模式 3)中断模式 4)快速中断模式 5)终止模式 6)未定义指令模式 7)系统模式 其中,除用户模式外,其他6种模式称为 ...

  2. ARM中SP、LR、PC三个寄存器介绍

    堆栈指针R13(SP) MSP堆栈指针 PSP堆栈指针 连接寄存器R14(LR) 1>.函数调用 当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复. 使用BL ...

  3. ARM中通过ldr pc, xxx地址,来跳转到对应的绝对地址去执行

    先来了解一下ldr指令: LDR 是ARM中的指令,也是伪指令. 当用 LDR r0, =num 编译时,编译器会根据num是否能表示为立即数,决定用 ldr 指令或者是mov或mvn指令. 当num ...

  4. linux中的运行模式,Linux系统运行模式介绍

    Linux运行模式 自由服务,即不需要用户独立去安装的软件服务,而是在系统安装好之后就可以直接使用的服务(内置服务). 运行模式也称为运行级别,属于linux的自有服务. 运行模式可以理解为一旦你开机 ...

  5. 解析ARM中OS_CPU_A.S(中断级方式)

    MRS:Move PSR to register,将程序状态寄存器的值复制到通用寄存器 例:MRS R0,CPSR; 传送CPSR 的内容到 R0 MSR:Move Register to PSR,将 ...

  6. 【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )

    一. 中断控制 ( 基于 S3C6410 开发板 ) 1. 关闭中断的两个步骤 (1) 关闭中断步骤 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介 (2) CPRS 寄存器 中断 ...

  7. 【嵌入式开发】ARM 处理器工作模式 及 修改方法 ( 处理器模式 | 设置处理器模式 | 程序状态字寄存器 CPSR SPSR | 模式设置代码编写 | 设置 svc 模式 )

    一. 处理器工作模式相关介绍 1. 处理器模式简介 (1) 处理器工作模式分类 (2) 处理器不同工作模式区别 (3) Linux 系统运行的模式 (4) 特权模式 说明 (5) 异常模式 (6) 系 ...

  8. 【转】sp,lr,pc即汇编语言中几个常见寄存器的使用

    arm汇编基础(转) 先看个例子: void test2(int a,int b,int c) { int k=a,j=b,m=c; } GCC反汇编: 00000064 <test2>: ...

  9. ARM 内核SP,LR,PC寄存器的理解

    ARM 内核SP,LR,PC寄存器 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的 ...

最新文章

  1. 腾讯优图+厦门大学发布!2021十大人工智能趋势
  2. java基础学习总结(一)
  3. SpringCloud系列十二:SpringCloudSleuth(SpringCloudSleuth 简介、SpringCloudSleuth 基本配置、数据采集)...
  4. 学python用什么系统好-学Python用什么系统?
  5. 手机客户端连接linux
  6. Micsorft文档阅读笔记-Run-Time Type Information解析及使用
  7. php获取字符串长度函数strlen和mb_strlen
  8. html 修改坐标时间,牛顿:时间是人类的错觉,爱因斯坦:时间只是能更改的坐标...
  9. 甲骨文员工谈被裁原因;《绝地求生》停机维护;谷歌正研发折叠屏样机 | 极客头条...
  10. 淘宝现重大BUG,是程序员报复?官方回应
  11. 运放输入偏置电流方向_测试运算放大器的输入偏置电流
  12. win10以太网未识别的网络的解决方法
  13. MySQL - java.sql.SQLException: Data truncated for column ‘xx‘ at row 1
  14. linux 命令:ps 详解
  15. 咪咕音乐的下载音乐存储路径(MAC)
  16. JavaScript的String的replace和replaceAll的差别
  17. flutter 开发中问题盘锦
  18. pycharm快捷键记录
  19. 将符号(amp; amp;)解码为正常
  20. python的mapl画图y轴排_python中用Matplotlib做多个纵轴 (多y轴)

热门文章

  1. Elasticsearch Indexes管理手册
  2. 对Java面向对象的理解
  3. 这个人居然花了60天干这种事
  4. 透过ISICDM,看医学图像分析的未来趋势与挑战
  5. 沉默的螺旋理论(转载)
  6. GOTS认证有四个特点,你知道吗
  7. jenkins集成allure
  8. RC5T620-1017电源管理IC规格书/datasheet
  9. Java进阶-案例训练(十六)(商城项目(1))
  10. native react 集成微信登录_React Native 接入微博、微信、QQ 登录功能