ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器

news/2024/5/18 12:23:11/文章来源:https://blog.csdn.net/tilblackout/article/details/128191341

Cortex-M3处理器的寄存器包括R0~R15和一些特殊的寄存器。其中R0到R12是通用寄存器,但是一些16位的Thumb指令只能访问R0到R7(低寄存器),而32位的Thumb-2指令则可以访问所有这些寄存器。特殊寄存器只能通过特殊访问指令访问。

文章目录

  • 1 核心寄存器
    • 1.1 R13(Stack Pointer):MSP和PSP
    • 1.2 R14(Link Register)
    • 1.3 R15(Program Counter)
  • 2 特殊寄存器
    • 2.1 Program Status Register
    • 2.2 PRIMASK, FAULTMASK, and BASEPRI Registers
    • 2.3 Control Register

所有的寄存器如下图所示:
在这里插入图片描述

1 核心寄存器

AAPCS(ARM Architecture Procedure Calling Standard)定义的寄存器如下:

寄存器别名描述
r15PCProgram Counter(Current Instruction)
r14LRLink Register(Return Address)
r13SPStack Pointer
r12IPIntra-Procedure-call scratch register
r11v8Variable-register 8
r10v7Variable-register 7
r9v6,SB,TRVariable-register 6 or Platform Register
r8~r4v5~v1Variable-register 5 ~ Variable-register 1
r3~r0a4~a1Argument/scratch register 4 ~ Argument/scratch register 1

这里主要介绍R13~R15寄存器

1.1 R13(Stack Pointer):MSP和PSP

R13是堆栈指针,在CM3中,有两个独立的堆栈内存,用户只能访问当前的堆栈,如果要访问另一个需要用特殊寄存器的MRSMSR指令来进行操作。两种堆栈分别为:

  • MSP(Main Stack Pointer):默认的SP,用在操作系统内核、异常处理函数和所有需要优先权限的访问
  • PSP(Process Stack Pointer):通常由运行嵌入式操作系统的系统中的线程进程使用(不处于异常处理程序中时)

并不是两个堆栈都必须同时使用,对于简单的应用来说,只需要用到MSP。对于堆栈的访问需要用PUSHPOP指令。

PUSH {R0} ; R13=R13-4, then Memory[R13] = R0
POP {R0}  ; R0 = Memory[R13], then R13 = R13 + 4

PUSHPOP通常用于在子例程开始时将寄存器内容保存到堆栈内存中,然后在子例程结束时从堆栈中恢复寄存器。

subroutine_1PUSH {R0-R7, R12, R14} ; Save registers...                    ; Do your processingPOP {R0-R7, R12, R14}  ; Restore registersBX R14                 ; Return to calling function

因为寄存器PUSHPOP操作总是按字对齐的(地址必须是0x0,
0x4, 0x8,…),故SP/R13的低两位被硬件拉低,读取它将总是为0。

1.2 R14(Link Register)

LR用于在调用函数时,保存它下一条指令的PC。

main ; Main program
...
BL function1    ; Call function1 using Branch with Link instruction.; PC = function1 and; LR = the next instruction in main
...
function1
... 			; Program code for function 1
BX LR 			; Return

尽管PC的第0位总是为0(指令是按字或半字对齐的),但LR寄存器的第0位是可读写的,这是因为在Thumb指令集中,第0位用来指示ARM/Thumb状态。为了允许Thumb-2的程序能在其它支持Thumb-2的ARM处理器中运行,所以LSB是可读写的。

1.3 R15(Program Counter)

由于Cortex-M3处理器的流水线特性,当读取PC时,该值与此时正在执行指令的地址通常会相差4。例如:

0x1000 : MOV R0, PC     ; R0 = 0x1004

其他的指令,比如load指令,由于地址计算中的对齐,PC的有效值可能不是指令地址加4。但是在执行过程中,PC值仍然比指令地址提前至少2个字节。

直接向PC写入数值将触发一个跳转指令,但是LR寄存器不会更新。但无论是直接向PC写入值还是使用B/BL/BX等跳转指令,目标地址的LSB都应该设置为1,表示这是一个Thumb state操作。如果为0,尝试切换到ARM state则会触发异常。

2 特殊寄存器

Cortex-M3中的特殊寄存器如下:

  • Program Status registers (PSRs)
  • Interrupt Mask registers (PRIMASK, FAULTMASK, and BASEPRI)
  • Control register (CONTROL)

特殊寄存器只能通过MSRMRS指令访问,它们没有内存地址:

MRS <reg>, <special_reg>  ; Read special register
MSR <special_reg>, <reg>  ; write to special register

2.1 Program Status Register

程序状态寄存器PSRs被分为三个状态寄存器:

  • Application Program Status register (APSR)
  • Interrupt Program Status register (IPSR)
  • Execution Program Status register (EPSR)

这三个寄存器可以被同时访问,使用xPSR关键字表示这三个寄存器。下图所示为寄存器中具体的字段,还有ARM和ARM7 TDMI中xPSR的对比:
在这里插入图片描述

这些位的定义如下所示:

BitDecription
NNegative
ZZero
CCarry/borrow
VOverflow
QSticky saturation flag
ICI/ITInterrupt-Continuable Instruction (ICI) bits, IF-THEN instruction status bit
TThumb state, always 1; trying to clear this bit will cause a fault exception
Exception numberIndicates which exception the processor is handling

其中APSR是可读写的,而IPSREPSR是只读的。

MRS r0, APSR   ; Read Flag state into R0
MRS r0, IPSR   ; Read Exception/Interrupt state
MRS r0, EPSR   ; Read Execution state
MSR APSR, r0   ; Write Flag stateMRS r0, PSR    ; Read the combined program status word
MSR PSR, r0    ; Write combined program state word

2.2 PRIMASK, FAULTMASK, and BASEPRI Registers

PRIMASKFAULTMASKBASEPRI用来关闭异常。

Register NameDescription
PRIMASK仅1位。当为1时,表示允许NMIHard fault异常,而其它所有的中断和异常都会被屏蔽。默认值为0。
FAULTMASK仅1位。当为1时,表示仅允许NMI异常,其它所有中断和错误处理异常都会被屏蔽。默认值为0。
BASEPRI最多8位(取决于芯片应用的优先级位数)。它表示屏蔽优先级的等级,它将屏蔽所有比该优先级相同和更低的中断。默认值为0。
  • PRIMASKBASEPRI寄存器对于在对实时要求高的任务中,用来临时禁用中断非常有用
  • 而当任务崩溃时,可能会发生许多不同的错误,操作系统可以使用FAULTMASK临时禁用异常错误处理程序,这样在内核开始清理这些错误时,不会被其它错误所中断。因此,FAULTMASK为OS内核提供了处理错误条件的时间。

为了访问这些寄存器,芯片厂商CMSIS一般会在设备的驱动库中提供相应的C函数API:

x = __get_BASEPRI();   // Read BASEPRI register
x = __get_PRIMARK();   // Read PRIMASK register
x = __get_FAULTMASK(); // Read FAULTMASK register
__set_BASEPRI(x);      // Set new value for BASEPRI
__set_PRIMASK(x);      // Set new value for PRIMASK
__set_FAULTMASK(x);    // Set new value for FAULTMASK
__disable_irq();       // Clear PRIMASK, enable IRQ
__enable_irq();        // Set PRIMASK, disable IRQ

__get_BASEPRI()为例,其实现为:

__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)
{uint32_t result;__ASM volatile ("MRS %0, basepri" : "=r" (result) );return(result);
}

当然在汇编中,我们可以直接通过MRSMSR来访问:

MRS r0, BASEPRI    ; Read BASEPRI register into R0
MRS r0, PRIMASK    ; Read PRIMASK register into R0
MRS r0, FAULTMASK  ; Read FAULTMASK register into R0
MSR BASEPRI, r0    ; Write R0 into BASEPRI register
MSR PRIMASK, r0    ; Write R0 into PRIMASK register
MSR FAULTMASK, r0  ; Write R0 into FAULTMASK register

注意,这三个寄存器不能再user mode下被更改。

2.3 Control Register

控制寄存器用于定义privilege levelSP的选择。我们暂时关注该寄存器的低2位:

BitFunction
1Stack status
1 = Alternate stack is used
0 = Default stack(MSP) is used
thread mode下,Alternate stack为PSP,在handler mode下没有Alternate stack,该位必须设置为0
00 = Privileged in thread mode
1 = User state in thread mode
handler mode下,总是处于privilege mode

对于bit0来说,只有当内核处于thread mode并具有privilege时,该位才可写。在user statehandler mode下,不允许写入此位。除了写入这个寄存器之外,改变这个位的另一种方法是在异常返回时改变LR的第2位。

  • user state切换回privilege state的唯一方法是触发中断并在异常处理程序中更改此状态。

同样的,CMSIS提供了C函数来访问这个寄存器,当然我们也可以使用汇编来访问。

x = __get_CONTROL(); // Read the current value of CONTROL
__set_CONTROL(x);    // Set the CONTROL value to x
MRS r0, CONTROL      ; Read CONTROL register into R0
MSR CONTROL, r0      ; Write R0 into CONTROL register

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_231206.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用友NC6.5 Linux服务器环境部署

用友NC6.5 Linux服务器环境部署 1.环境配置要求  1.1 操作系统平台 应用服务器操作系统版本&#xff08;补丁&#xff09;中间件类型JDK 版本Linux-RedHat(x64&#xff0c;多核)Enterprise Linux Server release 6.3Websphere 8.5.0.1/UAP/Weblogic11SUN JDK1.7_51/IBM SDK,V…

ArgoDB 5.1 正式发布:多模融合、实时分析和数据安全多重升级

Transwarp ArgoDB是星环科技自主研发的高性能分布式分析型数据库&#xff0c;在PB级数据量上提供极致的数据分析能力。ArgoDB支持标准SQL语法和分布式事务&#xff0c;提供高并发高速数据写入、复杂查询、多模分析、数据联邦、隐私计算和动态脱敏等能力。基于星环科技ArgoDB数据…

PacBio HiFi 测序动植物基因组项目真实案例测评

HiFi Reads全称High fidelity reads, 是PacBio公司基于Sequel II平台产出的兼具长读长和高准确度的测序序列&#xff0c;该测序模式&#xff08;CCS测序模式&#xff09;一经问世&#xff0c;备受广大组学科研用户关注——其超长读长完美规避了二代测序short reads的天生不足&a…

PWN利器-pwntools安装、调试教程一览

关于pwntools Documentation: pwntools — pwntools 4.10.0dev documentation Github: https://github.com/Gallopsled/pwntools#readme GitHub - Gallopsled/pwntools-tutorial: Tutorials for getting started with Pwntools pwntools是一个CTF框架和漏洞利用的python开发…

基于java(ssm)学生在线课程学习系统源码(java毕业设计)

基于java&#xff08;ssm&#xff09;学生在线课程学习系统 学生在线课程学习系统是基于java编程语言&#xff0c;mysql数据库&#xff0c;ssm框架&#xff0c;和idea工具开发&#xff0c;本项目主要分为学生&#xff0c;管理员两个角色&#xff0c;学生的功能是登陆&#xff…

5款高效率,但是名气不大的小众软件

今天推荐5款十分小众的软件&#xff0c;但是每个都是非常非常好用的&#xff0c;用完后觉得不好用你找我。 1.多窗口文件整理——Q-Dir Q-Dir 是一款多窗口文件整理工具&#xff0c;特别适合用户频繁在各个文件夹中跳转进行复制粘贴的文件归档操作。如果你的电脑硬盘中文件已经…

红队渗透靶场之SickOs1.1

靶场考察知识 shellshock漏洞 shellshock即unix系统下的bash shell的一个漏洞, Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞, 向环境变量值内的函数定义后添加多余的字符串会触发此漏洞, 攻击者可利用此漏洞改变或绕过环境限制&#xff0c;以执行任意的sh…

vue中pc端大屏怎么进行rem适配(lib-flexible + postcss-plugin-px2rem)

npm i lib-flexible -Spostcss-plugin-px2rem在main.js中引入 import lib-flexible/flexible.js找到node_modules里找到lib-flexible&#xff0c;修改flexible.js 搜索540找到refreshRem函数修改 function refreshRem() {var width docEl.getBoundingClientRect().width;if (…

电脑e盘不见了怎么恢复?6个步骤找回e盘

电脑e盘不见虽然不是一件常见的事&#xff0c;但是也会有发生的情况。虽然我们还有其他磁盘&#xff0c;平时也会经常忽略e盘。但是e盘也是一个存储磁盘&#xff0c;当电脑e盘不见了&#xff0c;我们也会想要找回来。那么电脑里的e盘丢失了怎么找回呢&#xff1f;下面我们就一起…

【历史上的今天】12 月 6 日:微波炉问世;多媒体格式 Mkv 诞生;日立环球存储科技公司成立

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2022 年 12 月 6 日&#xff0c;在 1892 年的今天&#xff0c;世界著名电子电器之父西门子逝世。西门子&#xff08;Siemens&#xff09;是全球领先的科技企业&#xf…

使用RMI实现RPC

1 RMI简介 RMI(Remote Method Invocation) 远程方法调用。 RMI是从JDK1.2推出的功能&#xff0c;它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用&#xff08;JVM&#xff09;中的内容。 RMI 是Java语言的远程调用&#xff0c;无法实现跨语言。…

元宇宙工程系,来了一位“吃螃蟹”者

转自《中国科学报》 记者 温才妃 潘志庚&#xff08;右&#xff09;给学生讲授元宇宙技术。受访者供图 元宇宙办学潮正在高校中暗涌。 不久前&#xff0c;南京信息工程大学人工智能学院&#xff08;未来技术学院&#xff09;信息工程系正式更名为元宇宙工程系&#xff0c;成为…

Kubernetes v1.25 搭建单节点集群用于Debug K8S源码

参考说明 参考自&#xff1a;v1.25.0-CentOS-binary-install-IPv6-IPv4-Three-Masters-Two-Slaves.md&#xff0c;按照自己的理解修改了下。 搭建好的单节点v1.25.4版本集群 1. 集群环境准备 1.1. 主机规划 IP主机名主机角色操作系统安装组件192.168.11.71k8s-master1maste…

HTML网页设计【足球科普】学生DW静态网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

02-SpringBoot基础

一、回顾 二、知识目标 SpringBoot概述【了解】 SpringBoot快速入门【掌握】 SpringBoot启动原理【重点】 SpringBoot配置文件【掌握】 SpringBoot属性注入【掌握】 三、为什么使用SpringBoot&#xff1f; -SSM开发有哪些痛点&#xff1f; 1、在早期我们都是使用的是SSM来…

1.Spring概述(Spring官方文档总结)

目录 1.1jdk环境依赖 1.2 Spring介绍 1.3 Spring历史 1.4 设计理念 1.1 jdk环境依赖 从Spring Framework 5.1开始&#xff0c;Spring需要JDK 8 (Java SE 8)&#xff0c;并提供对JDK 11 LTS的开箱即用支持。建议将Java SE 8 update 60作为Java 8的最低补丁版本&#xff0c;但…

磁盘和文件系统管理(一)

检测并确认新硬盘 fdisk命令 查看或管理磁盘分区 fdisk -l [磁盘设备] 或 fdisk [磁盘设备] 交互模式中的常用指令 m、p、n、d、t、w、q d delete a partition * 删除分区 g create a new empty GPT partition table 创建一个新的空的GPT分区表(可以对大于2T磁盘进行分区) l…

如何安装Ambari集群_大数据培训

注意&#xff1a;以下操作主节点操作即可 1 制作本地源 制作本地源是因为在线安装Ambari太慢。制作本地源只需在主节点上进行。 1.1 配置HTTPD 服务 配置HTTPD 服务到系统层使其随系统自动启动 [roothadoop102 ~]# chkconfig httpd on [roothadoop102 ~]# service httpd …

【Opencv实战】高手勿入,Python使用Opencv+Canny实现边缘检测以及轮廓检测(详细步骤+源码分享)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 在这次的案例实战中&#xff0c;我们将使用Python 3和OpenCV。我们将使用OpenCV&#xff0c;因为它是…