当前位置: 首页 > news >正文

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寄存器)中的位分配如图:

 (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=0r1=0x00000001SUBS  r1,r1,#1

SUB指令执行结束后:

        r1=0x0cpsr中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寄存器组织

ARM有37个32位长的寄存器&#xff1a; 1个用做PC&#xff08;Program Counter&#xff09;&#xff1b; 1个用做CPSR(Current Program Status Register)&#xff1b; 5个用做SPSR&#xff08;Saved Program Status Registers&#xff09;&#xff1b; 30个通用寄存器。 AR…...

记录一次webdav协议磁盘挂载经验总结

记录一次磁盘挂载经验总结 文章目录 记录一次磁盘挂载经验总结适配环境服务器协议适配方案脚本与详细说明 适配环境 windows 11windows 10windows 7 x86 and x64linuxuos统信国产化linux系统 服务器协议 webdav 适配方案 一、通用 winfsprclone 已验证通过&#xff0c;版…...

安装Django

1. 在物理环境安装Django Python官方的PyPi仓库为我们提供了一个统一的代码托管仓库&#xff0c;所有的第三方库&#xff0c;甚至你自己写的开源模块&#xff0c;都可以发布到这里&#xff0c;让全世界的人分享下载 pip是最有名的Python包管理工具 。提供了对Python包的查找、…...

【前端面经】JS-如何使用 JavaScript 来判断用户设备类型?

在 Web 开发中&#xff0c;有时需要针对不同的设备类型进行不同的处理。例如&#xff0c;对于移动设备&#xff0c;我们可能需要采用不同的布局或者交互方式&#xff0c;以提供更好的用户体验。因此&#xff0c;如何判断用户设备类型成为了一个重要的问题。 1. 使用 navigator…...

压缩HTML引用字体

内容简介 有些网站为了凸显某部分字体&#xff0c;而引入自定义字体&#xff0c;但由于自定义字体相对都比较大&#xff08;几M&#xff09;,导致页面加载缓慢&#xff1b;所以本文介绍三种压缩字体的方法&#xff0c;可根据项目情况自行选择。 压缩方法 1、利用Fontmin程序&a…...

大厂高频面试:底层的源码逻辑知多少?

你好&#xff0c;我是何辉。今天我们来聊一聊Dubbo的大厂高频面试题。 大厂面试&#xff0c;一般重点考察对技术理解的深度&#xff0c;和中小厂的区别在于&#xff0c;不仅要你精于实战&#xff0c;还要你深懂原理&#xff0c;勤于思考并针对功能进行合理的设计。 网上一直流…...

【学习笔记】CF607E Cross Sum

最后一道数据结构&#xff0c;不能再多了。 而且需要一点计算几何的知识&#xff0c;有点难搞。 分为两个部分求解。 首先考虑找到距离 ≤ r \le r ≤r的交点数量。发现这等价于圆上两段圆弧相交&#xff0c;因此将圆上的点离散化后排序&#xff0c;用一个主席树来求就做完了…...

Python 一元线性回归模型预测实验完整版

一元线性回归预测模型 实验目的 通过一元线性回归预测模型&#xff0c;掌握预测模型的建立和应用方法&#xff0c;了解线性回归模型的基本原理 实验内容 一元线性回归预测模型 实验步骤和过程 (1)第一步&#xff1a;学习一元线性回归预测模型相关知识。 线性回归模型属于…...

GStreamer第一阶段的简单总结

这里写目录标题 前言个人的总结v4l2src插件的简单使用 前言 因为涉及很多细节的GStreamer官方论坛有详细解链接: GStreamer官网&#xff0c;这里不做说明&#xff0c;以下只是涉及到个人的理解和认知&#xff0c;方便后续的查阅。 个人的总结 1)了解pipeline的使用&#xff0…...

【网络进阶】服务器模型Reactor与Proactor

文章目录 1. Reactor模型2. Proactor模型3. 同步IO模拟Proactor模型 在高并发编程和网络连接的消息处理中&#xff0c;通常可分为两个阶段&#xff1a;等待消息就绪和消息处理。当使用默认的阻塞套接字时&#xff08;例如每个线程专门处理一个连接&#xff09;&#xff0c;这两…...

使用div替代<frameset><frame>的问题以及解决办法

首先是原版三层框架的html&#xff1a; <html> <head> <title>THPWP</title> </head> <!-- 切记frameset不能写在body里面&#xff0c;以下代表首页由三层模块组成&#xff0c;其中第一层我是用来放菜单高度占比14%&#xff0c;中间的用作主…...

Verilog中的`define与`if的使用

一部分代码可能有时候用&#xff0c;有时候不用&#xff0c;为了避免全部编译占用资源&#xff0c;可以使用条件编译语句。 语法 // Style #1: Only single ifdef ifdef <FLAG>// Statements endif// Style #2: ifdef with else part ifdef <FLAG>// Statements …...

沃尔玛、亚马逊影响listing的转化率4大因素,测评补单自养号解析

1、listing的相关性&#xff1a;前期我们在找词&#xff0c;收集词的时候&#xff0c;我们通过插件来协助我们去筛选词。我们把流量高&#xff0c;中&#xff0c;低的关键词都一一收集&#xff0c;然后我们再进行对收集得来的关键词进行分析&#xff0c;再进行挑词&#xff0c;…...

静态分析和动态分析

在开发早期&#xff0c;发现并修复bug在许多方面都有好处。它可以减少开发时间&#xff0c;降低成本&#xff0c;并且防止数据泄露或其他安全漏洞。特别是对于DevOps&#xff0c;尽早持续地将测试纳入SDLC软件开发生命周期是非常有帮助的。 这就是动态和静态分析测试的用武之地…...

代码随想录_贪心_leetcode 1005 134

leetcode 1005. K 次取反后最大化的数组和 1005. K 次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以…...

笔记:对多维torch进行任意维度的多“行”操作

如何取出多维torch指定维度的指定“行” 从二维torch开始新建torch取出某一行取出某一列一次性取出多行取出连续的多行取出不连续的多行 一次取出多列取出连续的多列取出不连续的多列 考虑三维torch取出三维torch的任意两行&#xff08;means 在dim0上操作&#xff09;取出连续…...

【VSCode】1、VSCode 如何连接服务器

文章目录 一、安装 remote-ssh 插件二、直接连接三、配置 SSH 公匙&#xff0c;免密登录 一、安装 remote-ssh 插件 点击插件搜索框&#xff0c;搜 remote-ssh&#xff0c;点击安装 安装完成后就会出现下面的图标&#xff1a; 二、直接连接 点击加号&#xff0c;输入 ssh 连接…...

AI工具:通过智能实现工作和学习效率的革命化

AI工具是指一系列人工智能技术和工具&#xff0c;包括机器学习、深度学习、自然语言处理、计算机视觉等。这些工具可以帮助开发人员和数据科学家通过处理和分析海量数据来自动识别和解决问题&#xff0c;提供智能的决策和预测模型。常见的AI工具包括TensorFlow、PyTorch、Keras…...

static 和构造方法

文章目录 static构造方法内存中数据的存储方式示例 static 具体对象的属性&#xff0c;称之为对象属性&#xff0c;成员属性&#xff0c;实例属性。 具体对象的方法&#xff0c;称之为对象方法&#xff0c;成员方法&#xff0c;实例方法。 静态&#xff1a;static 和具体对…...

【Linux 裸机篇(八)】I.MX6U EPIT 定时器中断、定时器按键消抖

目录 一、EPIT 定时器简介二、定时器按键消抖 一、EPIT 定时器简介 EPIT 的全称是&#xff1a; Enhanced Periodic Interrupt Timer&#xff0c;直译过来就是增强的周期中断定时器&#xff0c;它主要是完成周期性中断定时的。学过 STM32 的话应该知道&#xff0c; STM32 里面的…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

C++ 类基础:封装、继承、多态与多线程模板实现

前言 C 是一门强大的面向对象编程语言&#xff0c;而类&#xff08;Class&#xff09;作为其核心特性之一&#xff0c;是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性&#xff0c;包括封装、继承和多态&#xff0c;同时讨论类中的权限控制&#xff0c;并展示如何使用类…...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...