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

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

目录​​​​​​​

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.kler.cn/news/359890.html

相关文章:

  • 【BUG】解决已安装anaconda的pycharm中jupyter服务器中出现的import jieba失败问题
  • SpringBoot启动报错java.nio.charset.MalformedInputException: Input length =1
  • SAP揭秘者-怎么查看SAP 版本及S4 HANA的版本
  • 开启RefCell debug_refcell feature查看借用冲突位置
  • PCL 基于中值距离的点云对应关系
  • linux模拟:chrony同步时间
  • 信创:推动信息技术应用创新的国产化之路
  • react18中在列表中如何使用useCallback进行渲染优化
  • 大模型的检索增强生成综述研究
  • 利用TLP185光耦合器增强电路隔离和信号完整性
  • (AtCoder Beginner Contest 375) 题解(下)
  • 408 10——42题
  • [英语单词] sk_under_memory_pressure
  • MySQL 初阶——多版本控制 MVCC
  • Tkinter -- python GUI学习与使用
  • 1.前提配置 关防火墙 关selinux
  • 每日一题|910.最小差值II|数组排序思路、单调性
  • 深入理解Python函数
  • SAP B1 账套锁定解决方案
  • 【渗透测试】-红日靶场-获取web服务器权限