首页 > 其他分享 >ARM 中SP,LR,PC寄存器的作用

ARM 中SP,LR,PC寄存器的作用

时间:2024-01-26 14:45:24浏览次数:29  
标签:SP 模式 ARM PC 地址 LR 寄存器 arm

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 */

标签:SP,模式,ARM,PC,地址,LR,寄存器,arm
From: https://www.cnblogs.com/FireLife-Cheng/p/17989370

相关文章

  • 网工内推 | 网络安全工程师专场,CISP、HCIE安全认证优先
    01八马茶业招聘岗位:网络安全工程师职责描述:1、负责公司信息安全项目实施及技术支持工作,主要包含信息安全风险检查评估、网络安全设备、服务器及网站日志审查等;2、应用、服务器和网络架构进行安全检查测试,找出安全漏洞并提出修改建议;3、组织协调服务器,网络和应用支持团队修复发现的......
  • SpringBoot中Bean的条件装配
    目录概述ProfileConditionalConditionalOnConditionalOnProperty概述众所周知,SpringBoot最腻害的地方就是容器,开发人员的日常工作就是编写bean,并由框架扫描存到容器里面,当程序跑起来的时候,各种bean协同工作完成了软件功能。那么容器是什么呢?从概念层面来讲,容器是一个池子;从物......
  • 使用Spring Data JPA实现审计功能,记录创建人、创建时间、最后修改时间和最后修改人
    目录前言近日心血来潮想做一个开源项目,目标是做一款可以适配多端、功能完备的模板工程,包含后台管理系统和前台系统,开发者基于此项目进行裁剪和扩展来完成自己的功能开发。本项目为前后端分离开发,后端基于Java21和SpringBoot3开发,后端使用SpringSecurity、JWT、SpringDataJP......
  • SpringBoot中集成XXL-JOB分布式任务调度平台,轻量级、低侵入实现定时任务
    场景XXL-JOBhttps://www.xuxueli.com/xxl-jobXXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。特性:1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生......
  • 使用ZLMediaKit对RTSP流转MP4进行播放
    框架地址:https://github.com/ZLMediaKit/ZLMediaKit/wiki/MediaServer%E6%94%AF%E6%8C%81%E7%9A%84HTTP-API 部署ZLMediaKit解码器https://blog.csdn.net/u011374856/article/details/124802856?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog......
  • github action 自动化部署asp.net core应用到服务器
    在自己的仓库里工作流编辑workflow贴上自己的工作流name:ASP.NETCoreDeploymenton:push:branches:-master#你可以根据需要更改分支名称(在向master分支推送的时候触发这个workflow)jobs:deploy:runs-on:ubuntu-latest#使用Ubuntu环......
  • SpringBoot整合Redis
    1、pom.xml中引入redis依赖<!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、application.yml配置文件中配置Redis连接参数等s......
  • 修改vSphere ESXi中虚拟机的三大件CPUID,硬盘ID,MAC地址
    1、查看硬件信息 wmicdiskdrivegetserialnumber查看磁盘序列号wmicbiosgetserialnumber查询BIOS序列号wmicnicconfiggetmacaddress查询网卡MAC信息wmiccpugetprocessorid查询cpu的IDwmicbeseboardgetserialnumber查询主板序列号 2、修改CPUID......
  • Spring源码导入IDEA记录
    一、首先Spring源码是gradle搭建,gradle会和jdk版本、IDEA产生兼容问题参考【学不完@根本学不完】的文章:SpringBoot版本与Spring、java、maven、gradle版本对应汇总=>由于本地JDK是1.8对应Java8,按照尽可能看新版本查找=>对应表格里面gradle7.x二、gradle安装步骤gradle历......
  • 使用dataspell 进行dbt 项目开发
    dataspell是jetbrains的数据开发工具,是一个很不错的数据开发ide,同时也支持对于dbt项目的开发我们可以使用类似idea的开发模式进行dbt项目开发参考效果项目结构数据管理注意需要自己配置数据源(可以使用遗留模式的jdbc,或者基于arrowflightjdbc)run/debug说明......