【ARM】ARM架构参考手册_Part A CPU(1)

news2024/10/21 15:51:51

目录​​​​​​​

1.1 关于ARM架构

1.1.1 ARM寄存器

1.1.2 异常

1.1.3 状态寄存器

1.2 ARM指令集

1.2.1 分支指令

1.2.2 数据处理指令

算术/逻辑指令

比较指令

乘法指令

计算前导零指令

1.2.3 状态寄存器传送指令

1.2.4 加载和存储指令

加载和存储寄存器

加载和存储多寄存器

交换寄存器和内存内容

1.2.5 协处理器指令

数据处理指令

数据传输指令

寄存器传输指令

1.2.6 异常生成指令

软件中断指令 SWI(Software Interrupt)

软件断点指令 BKPT(BreakPoint)


1.1 关于ARM架构

ARM架构被设计为允许非常小的尺寸,同时保持高性能的实现。ARM处理器的架构简单性导致了非常小的实现,而小的实现允许设备具有非常低的功耗。 ARM是一种精简指令集计算机(RISC),因为它包含了这些典型的RISC架构特征:

  • 一个大型统一寄存器文件
  • 一种加载/存储架构,其中数据处理操作仅在寄存器内容上进行,而不是直接在内存内容上进行
  • 简单的寻址模式,所有加载/存储地址都是由寄存器内容和指令字段决定的
  • 统一且固定长度的指令字段,以简化指令解码 此外,ARM架构提供了:
  • 在每条数据处理指令中对算术逻辑单元(ALU)和移位器的控制,以最大化ALU和移位器的使用
  • 自增和自减寻址模式,以优化程序循环
  • 加载和存储多条指令,以最大化数据吞吐量
  • 所有指令的条件执行,以最大化执行吞吐量 这些对基本RISC架构的增强,使得ARM处理器能够在高性能、低代码大小、低功耗和低硅片面积之间取得良好的平衡。

1.1.1 ARM寄存器

ARM有31个通用的32位寄存器。在任何时候,这些寄存器中有16个是可见的。其他寄存器用于加速异常处理。ARM指令中的所有寄存器说明符都可以访问这16个可见寄存器中的任何一个。 主要的16个寄存器组由所有未特权代码使用。这些是用户模式寄存器。用户模式与其他模式不同,因为它是未特权的,这意味着:

  • 用户模式是唯一一个在不生成异常的情况下不能切换到另一个处理器模式的模式
  • 内存系统和协处理器可能会允许用户模式对内存和协处理器功能的访问权限少于特权模式

在16个可见寄存器中,有两个寄存器具有特殊角色:

链接寄存器

寄存器14是链接寄存器(LR)。这个寄存器保存了在分支链接(BL)指令之后的下一个指令的地址,BL指令是用来进行子程序调用的指令。在所有其他时候,R14可以用作通用寄存器。

程序计数器

寄存器15是程序计数器(PC)。它在大多数指令中可以作为指向正在执行的指令之后的两个指令的指针。所有ARM指令都是四个字节长(一个32位字),并且总是对齐在字边界上。这意味着PC的最低两位总是零,因此PC只包含30个非恒定位。 剩下的14个寄存器没有特殊的硬件用途。它们的用途完全由软件定义。 软件通常使用R13作为堆栈指针(SP)。 

1.1.2 异常

ARM支持五种类型的异常,每种类型都有相应的特权处理模式。这五种类型的异常是:

  • 快速中断
  • 普通中断
  • 存储器中止,可以用来实现存储器保护或虚拟存储器
  • 尝试执行未定义指令
  • 软件中断(SWI)指令,可以用来调用操作系统。

当异常发生时,一些标准寄存器会被特定于异常模式的寄存器替换。所有异常模式都有用于R13和R14的替换bank寄存器。快速中断模式有更多的寄存器用于快速中断处理。

当进入异常处理程序时,R14保存了异常处理的返回地址。这用于在异常处理后返回,并处理引起异常的指令。

寄存器13在异常模式之间是bank的,以提供给每个异常处理程序一个私有的堆栈指针。 快速中断模式还对寄存器8到12进行了bank化,以便中断处理可以开始,而无需保存或恢复这些寄存器。

还有第六种特权处理模式,系统模式,它使用用户模式寄存器。这用于运行需要对存储器和/或协处理器有特权访问的任务,而没有对任务期间可能发生哪些异常的限制。 

异常处理过程

当异常发生时,ARM处理器在当前指令执行完毕后停止执行,并开始在内存中的一个固定地址执行,这些地址被称为异常向量。每个异常都有单独的向量位置。

操作系统在初始化时会在每个异常上安装一个处理程序。通常,特权操作系统任务在系统模式下运行,以允许在操作系统内部发生异常而不丢失状态。

1.1.3 状态寄存器

除了通用寄存器内容之外的所有处理器状态都保存在状态寄存器中。当前的处理器状态保存在当前程序状态寄存器(CPSR)中。CPSR保存有:

  • 4个条件码标志(负数、零、进位和溢出)
  • 2个中断禁用位,每种类型的中断各有一个
  • 5位编码当前处理器模式
  • 1位编码当前执行的是ARM指令还是Thumb指令

每个异常模式也有一个保存程序状态寄存器(SPSR),它保存了异常发生前任务的CPSR。CPSR和SPSRs通过特殊指令进行访问。

1.2 ARM指令集

ARM指令集可以分为六大类指令:

  • 分支指令
  • 数据处理指令
  • 状态寄存器传送指令
  • 加载和存储指令
  • 协处理器指令
  • 异常生成指令

大多数数据处理指令和一种类型的协处理器指令可以根据它们的结果更新CPSR中的四个条件码标志(负数、零、进位和溢出)。

几乎所有的ARM指令都包含一个4位的条件字段。这个字段的一个值指定指令无条件执行。其他十四个值指定指令的条件执行。如果当指令开始执行时,条件码标志表明相应的条件为真,则指令正常执行。否则,指令不执行任何操作。这14个可用的条件允许:

  • 测试相等和不相等
  • 在有符号和无符号算术中测试<、<=、>和>=不等式
  • 单独测试每个条件码标志

条件字段的第十六个值用于一些不允许条件执行的指令。

1.2.1 分支指令

除了允许许多数据处理或加载指令通过写入PC来改变控制流外,还提供了一个标准分支指令,该指令有一个24位的有符号偏移量,允许向前和向后分支最多32MB。

还有一个分支链接(BL)选项,它还会在R14中保存分支后的指令地址,即LR。这提供了一个子程序调用,可以通过将LR复制到PC来返回。

还有一些分支指令可以切换指令集,以便在分支目标处使用Thumb指令集继续执行。这允许ARM代码调用Thumb子程序,以及ARM子程序返回到Thumb调用者。Thumb指令集中的类似指令允许相应的Thumb → ARM切换。

1.2.2 数据处理指令

数据处理指令对通用寄存器进行计算。有四种类型的数据处理指令:

  • 算术/逻辑指令
  • 比较指令
  • 乘法指令
  • 计算前导零指令
算术/逻辑指令

有十二个算术/逻辑指令,它们共享一个通用的指令格式。这些指令对多达两个源操作数执行算术或逻辑操作,并将结果写入目标寄存器。它们还可以根据结果选择性地更新条件码标志。 在两个源操作数中:

  • 一个始终是寄存器
  • 另一个有两种基本形式:
    • 一个立即值
    • 一个寄存器值,可以选择性地进行移位。

如果操作数是移位寄存器,移位量可以是立即值或另一个寄存器的值。可以指定四种类型的移位。因此,每个算术/逻辑指令都可以执行算术/逻辑和移位操作。因此,ARM没有专门的移位指令。 由于程序计数器(PC)是一个通用寄存器,算术/逻辑指令可以直接将结果写入PC。这允许轻松实现各种跳转指令。

比较指令

有四个比较指令,它们使用与算术/逻辑指令相同的指令格式。这些指令对两个源操作数执行算术或逻辑操作,但不将结果写入寄存器。它们总是根据结果更新条件标志。 比较指令的源操作数采用与算术/逻辑指令相同的形式,包括能够包含移位操作的能力。

乘法指令

乘法指令分为两类。两种类型的乘法指令都将两个32位寄存器值相乘,并将结果存储:

  • 32位结果 正常。将32位结果存储在寄存器中。
  • 64位结果 长。将64位结果存储在两个单独的寄存器中。 两种类型的乘法指令都可以选择性地执行累加操作。
计算前导零指令

计算前导零(CLZ)指令确定寄存器值最高有效位的零位数,直到第一个1位。这个数字被写入CLZ指令的目的寄存器。

1.2.3 状态寄存器传送指令

状态寄存器传送指令将CPSR或SPSR的内容传送到通用寄存器,或者从通用寄存器传送到CPSR或SPSR。写入CPSR可以:

  • 设置条件码标志的值
  • 设置中断使能位的值
  • 设置处理器模式

1.2.4 加载和存储指令

以下是可用的加载和存储指令:

  • 加载和存储寄存器
  • 加载和存储多寄存器
  • 交换寄存器和内存内容
加载和存储寄存器

加载寄存器指令可以从内存中加载一个32位字、16位半字或8位字节到寄存器。字节和半字加载可以在加载时自动零扩展或符号扩展。 存储寄存器指令可以将寄存器中的32位字、16位半字或8位字节存储到内存中。 加载和存储寄存器指令有三种主要的寻址模式,所有模式都使用基寄存器和指令指定的偏移量:

  • 在偏移寻址中,内存地址是通过将偏移量加到或从基寄存器值中减去形成的。
  • 在预索引寻址中,内存地址的形成方式与偏移寻址相同。作为副作用,内存地址也被写回到基寄存器。
  • 在后索引寻址中,内存地址是基寄存器值。作为副作用,偏移量被加到或从基寄存器值中减去,并将结果写回到基寄存器。

在每种情况下,偏移量可以是立即值或索引寄存器的值。基于寄存器的偏移量也可以通过移位操作进行缩放。 由于PC是通用寄存器,可以直接将32位值加载到PC中,以执行跳转到4GB内存空间中的任何地址。

加载和存储多寄存器

加载乘(LDM)和存储乘(STM)指令执行将任意数量的通用寄存器块传输到内存或从内存传输。提供了四种寻址模式:

  • 预增加
  • 后增加
  • 预减少
  • 后减少

基地址由寄存器值指定,该值可以在传输后选择性地更新。由于子程序返回地址和PC值在通用寄存器中,因此可以使用LDM和STM构建非常高效的子程序进入和退出序列:

  • 子程序入口处的单个STM指令可以将寄存器内容和返回地址推到堆栈上,在此过程中更新堆栈指针。
  • 子程序出口处的单个LDM指令可以从堆栈中恢复寄存器内容,将PC加载返回地址,并更新堆栈指针。 LDM和STM指令还允许非常高效的代码用于块复制和类似的数据移动算法。
交换寄存器和内存内容

交换(SWP)指令执行以下操作序列:

  • 从寄存器指定的内存位置加载一个值。
  • 将寄存器的内容存储到相同的内存位置。
  • 将步骤1中加载的值写入寄存器。

通过为步骤2和3指定相同的寄存器,内存位置和寄存器的内容被交换。 交换操作执行一种特殊的不可分割的总线操作,允许原子更新信号量。支持32位字和8位字节信号量。

1.2.5 协处理器指令

协处理器指令有三种类型:

数据处理指令

这些指令启动特定于协处理器的内部操作。

数据传输指令

这些指令将协处理器数据传输到内存或从内存传输。传输的地址由ARM处理器计算。

寄存器传输指令

这些指令允许将协处理器值传输到ARM寄存器或从ARM寄存器传输。

协处理器指令使得ARM处理器能够利用外部协处理器的功能,执行特定的数据处理任务,如图形、音频、加密等。这些指令通过与协处理器的交互,扩展了ARM处理器的能力,使其能够处理更复杂的计算任务。

1.2.6 异常生成指令

有两种类型的指令设计用来引发特定的异常。

软件中断指令 SWI(Software Interrupt)

指令会导致软件中断异常发生。这些通常用于调用操作系统,请求操作系统定义的服务。由SWI指令引起的异常入口也会切换到特权处理器模式。这允许未特权的任务以操作系统允许的方式获得对特权功能的访问。

软件断点指令 BKPT(BreakPoint)

指令会导致中止异常发生。如果在中止向量上安装了合适的调试器软件,以这种方式生成的中止异常将被视为断点。如果系统中存在调试硬件,它也可以直接将BKPT指令视为断点,防止中止异常的发生。

除了上述指令外,以下类型的指令会导致未定义指令异常发生:

  • 任何硬件协处理器无法识别的协处理器指令
  • 大多数尚未被分配为ARM指令含义的指令字。

在每种情况下,这种异常通常用于生成适当的错误,或者启动指令的软件仿真。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用redis存储股股票数据及近一个月的行情数据

使用redis存储股票数据及近一个月的行情数据 性能瓶颈redis的使用odoo连接redis股票数据的读写结论 性能瓶颈 股票行情对数据的实时性是有要求的&#xff0c;在数据同步时如果都从数据库中查询数据&#xff0c;对于股票行情数据来说是有些慢了&#xff0c;因此我们使用redis来…

视频网站开发:Spring Boot框架的高效实现

5 系统实现 5.1用户信息管理 管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享&#xff0c;可以添加&#xff0c;修改&#xff0c;删除视频分…

HCIP-HarmonyOS Application Developer 习题(十五)

&#xff08;判断&#xff09;1、在HarmonyOs中发布带权限公共事件&#xff0c;发布者首先要在config.json中申请所需的权限。 答案&#xff1a;正确 分析&#xff1a;发布携带权限的公共事件&#xff1a;构造CommonEventPublishInfo对象&#xff0c;设置订阅者的权限。 &#…

基于springboot vue的音乐播放系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

【Postman】如何导出导入数据文件?Postman链接分享?

方式一&#xff1a;postman分享链接 1.1 导出 1.2 导入 1.3 导入完成后删除分享的链接 方式二&#xff1a;postman导出导入json 2.1 导出 2.2 post导入json数据

智慧监管:EasyCVR视频汇聚智能分析平台助力有限空间作业实现全天候可视化监控

随着工业化和城市化进程的加快&#xff0c;有限空间作业&#xff08;如地下管道、储罐、隧道等&#xff09;在各类企事业单位中日益频繁。然而&#xff0c;这类作业环境复杂、危险系数高&#xff0c;对作业人员的安全管理和实时监控提出了严峻挑战。为了保障有限空间作业的安全…

基于Java的茶叶商城设计与实现(源码+定制+开发)茶叶电商系统开发、茶叶电商平台开发、茶叶在线销售平台设计与开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x&#xff0c;FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目&#xff0c;根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…

细数RAG的12个痛点,英伟达高级架构师亲授解决方案

检索增强式生成&#xff08;RAG&#xff09;是一种使用检索提升语言模型的技术。具体来说&#xff0c;就是在语言模型生成答案之前&#xff0c;先从广泛的文档数据库中检索相关信息&#xff0c;然后利用这些信息来引导生成过程。这种技术能极大提升内容的准确性和相关性&#x…

野外便携定位终端|北斗三代短报文通信终端|移动通信终端

QM200B北斗三号便携终端是一款面对野外环境的北斗三代便携设备&#xff0c;具有低功耗、体积小、重量轻等特点。该设备不仅集成了北斗三代区域短电文通信、北斗三代定位功能、移动通信功能&#xff0c;同时具有语音对讲功能&#xff0c;配有液晶屏和功能按键&#xff0c;可在海…

一文彻底弄清Redis的布隆过滤器

布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的数据结构&#xff0c;用于快速判断一个元素是否在集合中。它能够节省大量内存&#xff0c;但它有一个特点&#xff1a;可能存在误判&#xff0c;即可能会认为某个元素存在于集合中&#xff0c;但实际上不存…

说了很久的建筑转大模型,也不过是想在职场完成赎身

问&#xff1a;为什么从规划转行到大模型&#xff1f; 1、房子卖不掉了&#xff0c;城镇化进入存量时代&#xff0c;发展的蛋糕有限&#xff0c;规划行业式微&#xff1b;而且生态规划更多是保护性规划&#xff0c;不是发展性规划&#xff0c;地方政府的驱动力不足。 2、智能…

ArchLinux VSCode 1.94.2无法安装or更新解决办法

此方法参考了这篇博客https://www.debugpoint.com/failed-connect-raw-githubusercontent-com-port-443/#google_vignette 某一次paru后&#xff0c;一直报错503什么的&#xff0c;在archlinux官网看到pacman安装的是个Open VSX版本的&#xff0c;是Arch官方的版本&#xff0c;…

【记录】VSCode|自用设置项

文章目录 1 基础配置1.1 自动保存1.2 编辑区自动换行1.3 选项卡换行1.4 空格代替制表符1.5 开启滚轮缩放 2 进阶设置2.1 选项卡不自我覆盖2.2 选项卡限制宽度2.3 选项卡组限制高度2.4 字体设置2.5 字体加粗2.6 侧边栏2.7 沉浸式代码模式 Zen Mode2.8 设置 Zen 模式的选项卡组 3…

Vxe UI vue vxe-table grid 如何滚动、定位到指定行或列

Vxe UI vue vxe-table vxe-grid 在表格中有时候需要对数据会列进行操作。可以会定位到某一行或某一列&#xff0c;vxe-table 中提供了丰富的函数式 API&#xff0c;可以轻松对行与列进行各种的灵活的操作。 定位到指定行与列 通过调用 scrollColumn(columnOrField) 方法&…

【Python】图形用户界面

在Python中&#xff0c;开发图形用户界面&#xff08;GUI&#xff09;的工具包有许多种&#xff0c;常用的包括&#xff1a; Tkinter&#xff1a;Python的标准GUI库&#xff0c;作为Python内置的一部分&#xff0c;简单易用&#xff0c;适用于轻量级应用。PyQt/PySide&#xf…

探索面向对象编程的核心:类、对象与封装

探索面向对象编程的核心&#xff1a;类、对象与封装 在学习Java编程时&#xff0c;面向对象编程&#xff08;OOP&#xff09;是一个非常重要的核心概念。今天我们将深入探讨其中最基本、但却非常重要的组成部分&#xff1a;类和对象&#xff0c;以及它们是如何通过封装来实现数…

全网免费的文献调研方法以及获取外网最新论文、代码和翻译pdf论文的方法(适用于硕士、博士、科研)

1. 文献调研 学术搜索引擎(十分推荐前三个&#xff0c;超有用)&#xff1a;使用 Google Scholar(https://scholar.google.com/)(https://scholar.google.com.tw/)(巨人学术搜索‬‬)、&#xff08;三个都可以&#xff0c;镜像网站&#xff09; arXiv(https://arxiv.org/)、&am…

企业架构系列(21)ArchiMate建模ADM阶段A:架构愿景

从本篇开始&#xff0c;将通过6篇文章逐一介绍如何使用 ArchiMate 的特定视角来创建与 TOGAF 架构开发方法相关的图形化模型或图表&#xff08;即&#xff0c;ADM中的图形制品&#xff0c;Graphical Artifacts&#xff09;。这些制品让利益相关者以可视化的方式来理解架构内容&…