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寄存器,在子程序间的连接text段中常使用该规则。

r13:栈指针,也称为sp寄存器。SP寄存器是ARM中的栈指针寄存器,用于存储当前栈顶的地址。在程序执行过程中,栈是用来存储临时变量、函数调用返回地址等数据的重要数据结构,SP寄存器的值会随着栈的变化而变化。

r14:连接寄存器,也称为lr寄存器。LR寄存器是ARM中的链接寄存器,程序跳转(子程序调用,中断跳转)后,arm自动在该寄存器中存入原程序(未跳转)的下一条指令的地址,也叫函数调用返回地址。当一个函数被调用时,LR寄存器会存储调用该函数的下一条指令的地址,当函数执行完毕后,程序会跳转到LR寄存器中存储的地址继续执行。

r15:程序计数器,也称为pc寄存器。保存的是当前正在取指的指令的地址(arm采用2级流水线,因此是当前正在执行指令的地址+8)。PC寄存器是ARM中的程序计数器,用于存储下一条将要执行的指令的地址。在程序执行过程中,PC寄存器的值会不断变化,指向下一条将要执行的指令的地址。当程序执行完毕时,PC寄存器的值会指向程序的结束地址。

汇编程序中最常用的就是SP、LR及PC三个寄存器。

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

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

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

msr spsr_cxsf, r0            /* 恢复spsr */

ARM 中SP,LR,PC寄存器的作用的更多相关文章

  1. 大脸猫讲逆向之ARM汇编中PC寄存器详解

    i春秋作家:v4ever 近日,在研究一些开源native层hook方案的实现方式,并据此对ARM汇编层中容易出问题的一些地方做了整理,以便后来人能有从中有所收获并应用于现实问题中.当然,文中许多介绍 ...

  2. JVM-运行时数据区之PC寄存器

    1.运行时数据区图 运行时数据区是在类加载完成后所经历的阶段,当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,执行引擎就 ...

  3. ARM 内核SP,LR,PC寄存器

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

  4. ARM中R0-R15寄存器的作用

    根据“ARM-thumb 过程调用标准”: 注意:在中断程序中,所有的寄存器都必须保护,编译器会自动保护R4-R11

  5. [zhuan]arm中的汇编指令

    http://blog.csdn.net/qqliyunpeng/article/details/45116615 一. 带点的(一般都是ARM GNU伪汇编指令)   1. ".text& ...

  6. ARM中的---汇编指令

    一. 带点的(一般都是ARM GNU伪汇编指令) 1. ".text".".data".".bss" 依次表示的是"以下是代码段& ...

  7. ARM汇编编程基础之一 —— 寄存器

    ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...

  8. ARM中LDR伪指令与LDR加载指令

    ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是“LDR Rn,=expr”.下面举一个例子来说明它的用法. COUNT EQU       0x4000310 ...

  9. ARM的编程模式及寄存器

    根据朱老师的课程及下面博客整理 http://blog.chinaunix.net/uid-20443992-id-5700979.html ARM 采用的是32位架构 ARM 约定: Byte : ...

  10. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

随机推荐

  1. 分享这位大神的WPF界面设计系列视频

    本文结构: 前言 视频详情 搬运详情 总结 4.1 国内推荐WPF资源 4.2 B站是学习的天堂 4.3 去外面看看 4.4 个人给C/S同学建议 1. 前言 今天介绍油管上一个大佬发的WPF设计系列 ...

  2. AHB-SRAMC Design-03

    SRAMC SRAM CORE 8块memory进行广播信号,例化8片memory

  3. 15-触摸按键控制LED灯

    1.触摸按键 触摸按键可分为四大类:电阻式,电容式,红外感应式和表面声波式 电阻式触摸按键使用人体破压电阻,改变电阻,实现开关效果,耐用性差,很少使用 红外感应式是通过红外扫描的方式,一般使用在比较恶 ...

  4. NSSCTF Round#11 Basic 密码个人赛复盘

    [NSSRound#11 Basic]ez_enc ABAABBBAABABAABBABABAABBABAAAABBABABABAAABAAABBAABBBBABBABBABBABABABAABBAA ...

  5. [转帖](1.3)sql server for linux 配置mssql-conf(即SSCM)

    https://blog.51cto.com/ultrasql/2152021 目录 [配置mssql-conf] 启用SQL Server代理 修改SQL Server排序规则 配置客户反馈 修改默 ...

  6. [转帖]InfluxDB 修改数据存储路径

    1.创建数据存储目录 mkdir -p /home/data/influxdb 说明:目录可以根据实际情况进行修改. 2.设置目录访问权限 sudo chown influxdb.influxdb / ...

  7. [转帖]TiFlash 源码阅读(一) TiFlash 存储层概览

    https://cloud.tencent.com/developer/article/1988629 背景 本系列会聚焦在 TiFlash 自身,读者需要有一些对 TiDB 基本的知识.可以通过这三 ...

  8. 【转帖】纳尼,mysqldump导出的数据居然少了40万?

    0.导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟. 1.问题 我的朋友小文前几天遇到一个怪事,他 ...

  9. [转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

    文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据).写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘.这对加 ...

  10. [转帖]传输层安全协议真(TLS)的安全吗?

    https://zhuanlan.zhihu.com/p/305161227 随着数字通信,计算机网络,公钥密码体制等技术的迅速发展,安全网络通信已经成为了人们的日常需求.TLS 作为目前被广泛应用的 ...