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

2023-05-16

寄存器定义和用途
定义
寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。

用途
可将寄存器内的数据执行算术及逻辑运算;
存于寄存器内的地址可用来指向内存的某个位置,即寻址;
可以用来读写数据到电脑的周边设备。
ARM中特殊的三个寄存器
在ARM体系中,一般分为四种寄存器:通用目的寄存器、堆栈指针(SP)、连接寄存器(LR) 以及 程序计数器(PC), 其中需要着重理解后面三种寄存器。

堆栈指针R13(SP)
每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。
当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。
连接寄存器R14(LR)
保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;
子程序通过把r14复制到PC来实现返回,通常用下列指令:MOV PC, LR;BX LR;
当异常发生时,异常模式的R14用来保存异常返回地址,将R14如栈可以处理嵌套中断。
程序计数器R15(PC)
PC是有读写限制的;
没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00;
在CM3内部使用了指令流水线,读PC时返回的值是当前指令的地址+4.
向PC中写数据,就会引起一次程序的分支(但是不更新LR寄存器),CM3中的指令至少是半字对齐的,所以PC的LSB总是读回0。
在分支时,无论是直接写 PC 的值还是使用分支指令,都必须保证加载到 PC 的数值是奇数(即 LSB=1),用以表明这是在Thumb 状态下执行。
倘若写了 0,则视为企图转入 ARM 模式,CM3 将产生一个 fault 异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARM中SP、LR、PC三个寄存器介绍 的相关文章

随机推荐

  • 【flask学习笔记】flask与HTTP,flask与mongodb交互,用手机输入局域网ip访问flask界面

    文章目录 引入 xff08 关于http flask项目的配置 引入 xff08 关于http 当我们在浏览器中的地址栏中输入这个URL xff0c 然后按下Enter时 xff0c 稍等片刻 xff0c 浏览器会显示一个问候页面 这背后有
  • java什么是monitor和Monitor监视器锁、对象布局

    文章目录 Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor 监视器锁 xff0c 加锁过程如下图所示 xff1a 任何一个对象都有一个Monitor与之关联 xff0c 当
  • proto的介绍和基础使用

    内容摘抄自书籍 Netty redis zookeeper高并发实战 Protobuf使用 proto文件来预先定义的消息格式 数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码 proto文件 xff0c 简单地说 xf
  • springboot使用oshi获取系统cpu、内存、jvm信息

    OSHI 是基于 JNA 的 xff08 本地 xff09 操作系统和硬件信息库 它不需要安装任何其他额外的本地库 xff0c 旨在提供一种跨平台的实现来检索系统信息 xff0c 例如操作系统版本 进程 内存和 CPU 使用率 磁盘和分区
  • 常用的linux命令

    目录相关命令 xff1a ls 列出当前目录下的文件列表信息 目录 文件夹 当前 xff1a 登陆成功之后 xff0c 打开终端所处的一个目录 a 显示隐藏文件 linux下以 开头的文件是隐藏文件 xff0c 默认不显示 l 显示目录下文
  • 字节后端一二面,讯飞一面

    1 自我介绍 2 rdb aof 3 线程池 4 ping命令用了什么协议 5 应用层的协议 6 为什么四次挥手要timewait 7 算法题 xff1a 和为k的子数组个数 xff08 前缀和 xff09 8 幻读 7 隔离级别 8 tc
  • mysql以某个字段分组进行条件查询,如果为0则补0

    需求 xff1a 有一个version plan表 xff0c 其中有一个字段is urgent 且每个version plan与一个模块moduleId关联 xff0c 现在要查出is urgent为1的模块数和这个模块的总数 xff0c
  • 数据库系统第六章-关系数据理论复习

    候选码若关系中的一个属性或属性组的值能够唯一地标识一个元组 xff0c 且他的子集不能唯一的标识一个元组 xff0c 则称这个属性或属性组做候选码 函数依赖 范式 虽然STC xff08 S T C xff09 3NF xff0c 但它仍存
  • Spring Security登录验证过程详解

    前端 xff1a 在前端页面输入username和password 通过地址login访问验证 后台 xff1a 调用 AbstractAuthenticationProcessingFilter doFilter 方法 原因 xff1a
  • 关于STL的一些理解

    1 集合set 定义 xff1a set lt int gt s1 类型可选 se begin 返回指向第一个元素的迭代器 se clear 清除所有元素 常用 se count 返回某个值元素的个数 常用 xff0c 一般用来查这个元素在
  • ModuleNotFoundError: No module named ‘...’:报错解决方案

    1 module包没安装 这个 就是包的名字 xff0c 看问题定位 xff0c import源文件 xff0c 然后去site packages里找那个模块 xff0c 如果是空的没安装 xff0c 这时候可以在对应的环境里使用pip i
  • C语言----结构体,枚举,共用体

    1 xff09 结构体 span class token comment 例 xff1a 一个描述学生的结构体 span span class token keyword struct span span class token class
  • Nvidia jetson agx xavier can通讯失败,修改时钟源pllaon

    一 问题详情 在调试Xavier can的过程中 xff0c can通信始终有问题 xff0c 收发都会报错 后来发现时钟源导致波特率不匹配 xff0c 所以不能通信 二 修改时钟源 在虚拟机使用官方sdkmanager xff0c 下载安
  • linux下实现https访问

    http转https 适用于linux服务器 linux下nginx 43 ssl实现https访问 xff08 一 xff09 环境准备 xff08 二 xff09 下载nginx源码 xff0c 编译nginx并添加ssl模块 xff0
  • Nvidia Jetson nano 安装Archiconda、gpu版torch、踩坑记录

    Nvidia Jetson nano 安装Archiconda gpu版torch 踩坑记录 jetson nano 属于aarch64架构 xff0c 不同于一般的x86 64的linux系统架构 xff0c 而torch官网上面 htt
  • linux下的yum,vim,gcc,gdb

    我们在windows系统下我们能够很简单进行粘贴复制下载安装 xff0c 也能通过vs进行我们缩写代码的编译运行 xff0c 但是我们在linux下我们应该怎样去操作我们的这些命令呢 xff0c 这章我们就讲解一下我们linux下常用的一些
  • 【Keil】Keil5添加源程序和头文件

    xxx c就是源程序 xxx h就是头文件 源程序添加方法 双击文件夹 xff0c 例如图片上的Source xff0c 跳出弹窗 xff0c 选择需要添加的源程序即可 添加头文件的方法 1 首先点击图片红框处 xff0c 或是在文件夹te
  • C 标准库 string常用函数 笔记

    文章目录 64 TOC 文章目录 前言字符串长度strlen sizeof 字符串拼接strcat strncat 字符串拷贝strcpy strncpy memcpy 内存填充memset 字符串比较strcmp strncmp 字符串查
  • node.js中的http.request方法使用说明_node.js

    方法说明 xff1a 函数的功能室作为客户端向HTTP服务器发起请求 语法 xff1a 复制代码 代码如下 http get options callback 由于该方法属于http模块 xff0c 使用前需要引入http模块 xff08
  • ARM中SP、LR、PC三个寄存器介绍

    寄存器定义和用途 定义 寄存器是中央处理器内的组成部份 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 用途 可将寄存器内的数据执行算术及逻辑运算 xff1b 存于寄存器内的地址可用来指向内存的某个位置 xf