ARMv8-AArch64寄存器和指令集

2023-05-16


(一)简述

AArch拥有31个通用寄存器,系统运行在64位状态下的时候名字叫Xn,运行在32位的时候就叫Wn;

这里写图片描述

AArch32与AArch64寄存器对应关系:

这里写图片描述


(二)PSTATE

PSTATE不是一个寄存器,它表示的是保存当前process状态信息的一组寄存器或者一些标志位信息的统称,当异常发生的时候这些信息就会保存到EL所对应的SPSR寄存器当中;

寄存器:

这里写图片描述

标志位:

type ProcState is (
bits (1) N, // Negative condition flag
bits (1) Z, // Zero condition flag
bits (1) C, // Carry condition flag
bits (1) V, // oVerflow condition flag
bits (1) D, // Debug mask bit [AArch64 only]
bits (1) A, // Asynchronous abort mask bit
bits (1) I, // IRQ mask bit
bits (1) F, // FIQ mask bit
bits (1) SS, // Software step bit
bits (1) IL, // Illegal execution state bit
bits (2) EL, // Exception Level (see above)
bits (1) nRW, // not Register Width: 0=64, 1=32
bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only]
bits (1) Q, // Cumulative saturation flag [AArch32 only]
bits (4) GE, // Greater than or Equal flags [AArch32 only]
bits (8) IT, // If-then execution state bits [AArch32 only]
bits (1) J, // J execution state bit [AArch32 only, RES0 in ARMv8]
bits (1) T, // T32 execution state bit [AArch32 only]
bits (1) E, // Endian execution state bit [AArch32 only]
bits (5) M // Mode field (see above) [AArch32 only]
)

PSTATE.{N, Z, C, V}: 条件标志位,这些位的含义跟之前AArch32位一样,分别表示补码标志,运算结果为0标志,进位标志,带符号位溢出标志,具体请参考:ARM(V8) Architecture Reference Manual.pdf page B1-62

PSTATE.SS:异常发生的时候,通过设置MDSCR_EL1.SS 为 1启动单步调试机制;

PSTATE.IL:异常执行状态标志,非法异常产生的时候,会设置这个标志位,会导致的事件请参考:D1.11.3page D1-1439

PSTATE.{D, A, I, F}:D表示debug异常产生,比如软件断点指令/断点/观察点/向量捕获/软件单步 等;A, I, F表示异步异常标志,异步异常会有两种类型:一种是物理中断产生的,包括SError(系统错误类型,包括外部数据终止),IRQ或者FIQ;另一种是虚拟中断产生的,这种中断发生在运行在EL2管理者enable的情况下:vSError,vIRQ,vFIQ;

PSTATE.nRW:表示当前ELx 所运行的状态,分为AArch64和AArch32:

  1. SPSR_EL1.M[4] 决定EL0的执行状态,为0(64bit ),1(32bit);
  2. HCR_EL2.RW 决定EL1的执行状态,为1(64bit ),0(32bit);
  3. SCR_EL3.RW确定EL2 or EL1的执行状态,为1(64bit ),0(32bit);

PSTATE.SP: 某个ELx 下的堆栈指针,EL0下就表示sp_el0;


SPSR registers:

SPSR状态寄存器:之前也有说过当运行在EL0层的时候,所用的是sp_el0,当在更高级ELx运行的时候同时可以使用spsr_el0或者spsr_elx,所以这里用t,h后缀来区分,SPSR_ELx保存了进入ELx的PSTATE状态信息:

这里写图片描述

这里写图片描述


(三)A64指令集

(0)A64特点

  1. 移除了批量加载寄存器指令 LDM/STM, PUSH/POP, 使用STP/LDP 一对加载寄存器指令代替;
  2. 没有提供访问CPSR的单一寄存器,但是提供访问PSTATE的状态域寄存器;
  3. A64没有协处理器的概念,没有协处理器指令MCR,MRC;
  4. 相比A32少了很多条件执行指令,只有条件跳转和少数数据处理这类指令才有条件执行.附件为条件指令码;

指令基本格式:

<Opcode>{<Cond>}<S>  <Rd>, <Rn> {,<Opcode2>}

Opcode:操作码,也就是助记符,说明指令需要执行的操作类型
Cond:指令执行条件码,查看附件图;
S:条件码设置项,决定本次指令执行是否影响PSTATE寄存器响应状态位值
Rd/Xt:目标寄存器,A32指令可以选择R0-R14,T32指令大部分只能选择RO-R7,A64指令可以选择X0-X30;
Rn/Xn:第一个操作数的寄存器,和Rd一样,不同指令有不同要求;
Opcode2:第二个操作数,可以是立即数,寄存器Rm和寄存器移位方式(Rm,#shit);

各种指令详细说明请查看ARM(V8) Architecture Reference Manual.pdf page C6-387 这里只是贴出了内存访问操作的指令;


内存操作指令load/store

所支持的寻址方式:

这里写图片描述

  1. Base register only (no offset) :基址寄存器无偏移;
  2. Base plus offset:基址寄存器加偏移;
  3. Pre-indexed:事先更新寻址,先变化后操作,[base, #imm]!,!表示则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变;
  4. Post-indexed:事后更新寻址,先操作后变化,[base], #imm;
  5. Literal (PC-relative): PC相对寻址;

load/store指令分类(C3.2-131):批量寄存器、单个寄存器、一对寄存器、非-暂存、非特权、独占}以及load-Acquire、store-Release指令;

(1)单个寄存器load/store:

这里写图片描述

以LDR为例,下面为三种取址方式:

这里写图片描述

如:LDR X1,[X2]; 取出X2寄存器存储的地址中的内容复制到X1;

这里写图片描述

如:LDR X1,[X2],#4; 取出X2寄存器存储的地址中的内容复制到X1,然后X2 = X2 + 4;

这里写图片描述

如:LDR X1,[PC,#4];

(2)unscaled offset load/store:

Scaled 和Unscaled其实就是可以见到理解为对齐和非对齐,本质就是是否乘以一个常量,因为scaled的总是可以乘以一个常量来达到对齐,而Unscaled就不需要,是多少就多少,更符合人类自然的理解,寻址方式只支持:基址 + 9bit 的立即数偏移值范围为(-256 ~ 255)因为是带有符号的;

这里写图片描述

以LDUR为例:

这里写图片描述

(3)Load/Store Pair:

从Memory地址addr处读取两个双字/字数据到目标寄存器Xt1,Xt2;寻址方式:对齐的,有符号#simm7偏移,支持pre-/post-index 操作;

这里写图片描述

以LDP为例:

这里写图片描述

(4)Load/Store Non-temporal Pair:

所谓Non-temporal就是就是用于你确定知道该地址只加载一次,不需要触发缓存,避免数据被刷新,优化性能,其它指令都默认会写Cache;寻址方式:对齐的,有符号#simm7偏移,不支持pre-/post-index 操作;

这里写图片描述

以LDNP为例:

这里写图片描述

(4)Load/Store Unprivileged:

所谓Unprivileged就是说EL0/EL1的内存有不同的权限控制,这条指令以EL0的权限存取,用于模拟EL0的行为,该指令应用于EL1和EL0之间的交互;寻址方式: 非对齐的,有符号#simm9偏移,不支持pre-/post-index 操作;

这里写图片描述

以LDTR为例:

这里写图片描述

(4)Load-Exclusive/Store-Exclusive:

在多核CPU下,对一个地址的访问可能引起冲突,这个指令解决了冲突,保证原子性(所谓原子操作简单理解就是不能被中断的操作),是解决多个CPU访问同一内存地址导致冲突的一种机制。通常用于锁,比如spinlock,可以参考代码:

arch/arm64/include/asm/spinlock.h

寻址方式:无偏移基址寄存器,不支持pre-/post-index 操作;

这里写图片描述

以LDXR为例:

这里写图片描述

(4)Load-Acquire/Store-Release:

内存屏障操作,Load-Acquire读操作,相当于半个DMB指令,只管读内存操作;Store-Release写操作,相当于半个DMB指令,只管写内存操作;本质是为了解决乱序执行中有依赖关系的指令可以按正确的逻辑执行的一种机制,而DMB,DSB,ISB的强制性(权限)由低到高;寻址方式:无偏移基址寄存器,不支持pre-/post-index 操作;
这里写图片描述

以LDAR为例:

这里写图片描述


附件

条件指令码

这里写图片描述

特殊符号定义:

特殊符号  对应伪操作   含义 
=        DCB       分配一片连续的字节存储单元并用指定的数据初始化
&        DCD       分配一片连续的字存储单元并用指定的数据初始化
%        SPACE     分配一片连续的存储单元
^        MAP       定义一个结构化内存表的首地址
#        FILED     定义一个结构化内存表的数据域(经常和MAP一起使用,一个定义起始地址,一个定义长度)
*        EQU       为程序中的常量、标号等定义一个等效的字符名
!                  地址更新
[                  相当于IF
|                  相当于ELSE
]                  相当于ENDIF
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARMv8-AArch64寄存器和指令集 的相关文章

随机推荐

  • C++基础知识

    1 面向对象的程序设计思想是什么 xff1f 答 xff1a 把数据结构和对数据结构进行操作的方法封装形成一个个的对象 2 什么是类 xff1f 答 xff1a 把一些 具有共性的对象归类后形成一个集合 xff0c 也就是所谓的类 3 对象
  • 【开关电源】降压变换器(BUCK)的断续模式建模

    1 前言 在DCDC变换器中BUCK变换器是最基础的一类降压型变换器 xff0c 它可以将输入电压降低后输出 在连续模式CCM下 xff0c 输出和输入之间的比值是D xff08 D为占空比 xff09 这种开关变换器是一种通过电子开关周期
  • 变量命名规范

    本文转载于https blog csdn net ZCF1002797280 article details 51495229 是我见过的描述最精炼 最好懂的命名文档 xff0c 故收藏转载推荐 1 驼峰命名法 1 1 小驼峰法 除第一个单
  • C++实现websocket服务器握手协议(使用Qt)

    前提 xff1a 笔者在开发server程序时 xff0c 要求websocket与server连接 websocket的机制是在第一次连接时进行握手协议 xff0c 协议通过 xff0c 才可以进行正常的通信 xff0c 否则websoc
  • 00011__ARM和STM32的区别

    https blog csdn net qq 34385566 article details 79668280
  • linux中查看系统资源占用情况的命令

    size 61 large top size 主要参数 d xff1a 指定更新的间隔 xff0c 以秒计算 q xff1a 没有任何延迟的更新 如果使用者有超级用户 xff0c 则top命令将会以最高的优先序执行 c xff1a 显示进程
  • 关于PendSV异常和SVC异常

    这里先说什么是异常 xff0c 什么是中断 xff1f 请下这张图 颜色加深的表项为异常 xff0c 这些属于cm3内核自带的 其中 3 xff0c 2 xff0c 1异常的优先级固定 xff0c 是不可更改的 xff0c 其余的异常中断优
  • FreeRTOS学习4-任务创建和删除

    关于任务创建有3个函数 1 动态创建一个任务 可以自动分配任务堆栈和TCB FreeRTOSConfig h中 xff0c 需要定义 define configSUPPORT DYNAMIC ALLOCATION 1 支持动态内存申请 Ba
  • java里 equals和== 区别

    1 java中equals和 61 61 的区别 值类型是存储在内存中的堆栈 xff08 简称栈 xff09 xff0c 而引用类型的变量在栈中仅仅是存储引用类型变量的地址 xff0c 而其本身则存储在堆中 2 61 61 操作比较的是两个
  • VRPTW建模与求解—基于粒子群算法

    VRPTW建模与求解 基于粒子群算法 1 VRPTW简要描述 VRPTW xff08 Vehicle Routing Problem with Time Windows xff09 是指在经典VRP的前提上 xff0c 给每个客户增添时间窗
  • 伽马分布,指数分布,泊松分布的关系 -转自简书

    原文链接 xff1a https www jianshu com p 6ee90ba47b4a 伽马分布 xff0c 指数分布 xff0c 泊松分布的关系 thinkando 关注 2018 09 25 21 13 字数 714 阅读 29
  • 双轴驱动步进电机云台二自由度单片机控制程序PTU57

    高精度云台由两个电机驱动 xff0c 可控制方位角和高度角 xff0c 具有两自由度的机械电子设备 可用于机器视觉 摄影摄像 监控安防 天文观测 雷达扫描 DIY雕刻机 转盘转台 智能机械手臂 双轴跟踪太阳能定日镜等各类应用高精度云台的场合
  • php使用curl获取需要认证的https请求

    lt php php使用curl获取需要认证的https请求的方法 url 61 34 XXXXXX 34 arr header 61 34 Accept application json 34 arr header 61 34 Autho
  • i-vector本质剖析

    1 i vector的由来 基于因子分析理论 xff0c 句子h的超向量可以描述成 其中为ubm模型的均值超向量 xff0c 即为i vector 2 i vector的计算 2 1 T矩阵的估计 为句子h的观察特征 xff0c 可以对应于
  • C++程序设计基础实验-实验七 多态性

    实验七多态性 一 实验目的 掌握运算符重载的方法 xff1b 掌握使用虚函数的继承实现动态多态性 掌握纯虚函数及抽象类的使用 二 实验内容 设计复数类Complex xff08 请参照教材例题8 1的设计 xff09 xff0c 实现运算符
  • g2o_a_general_framework_for_graph_optimaization

    g2o A General Framework for Graph Optimization NONLINEAR GRAPH OPTIMIZATION USING LEAST SQUARES 机器人和计算机视觉中的许多问题都可以用下列方程的
  • P5644 [PKUWC2018]猎人杀

    P5644 PKUWC2018 猎人杀 题目大意 一开始有 n n n 个猎人 xff0c 第 i i i 个猎人有仇恨度
  • 【Linux基础系列之】platform虚拟总线

    linux当中大多数的设备都是以paltform虚拟总线挂载上去的 xff0c 这里以kernel drivers net dm9000 c为例子分析一下 xff0c platform设备挂在过程 xff1b xff08 1 xff09 d
  • ARMv8-AArch64简述

    ARMv8是ARM版本升级以来最大的一次改变 xff0c ARMv8的架构继承以往ARMv7与之前处理器技术的基础 xff0c 除了现有的16 32bit的Thumb2指令支持外 xff0c 也向前兼容现有的A32 ARM 32bit 指令
  • ARMv8-AArch64寄存器和指令集

    xff08 一 xff09 简述 AArch拥有31个通用寄存器 xff0c 系统运行在64位状态下的时候名字叫Xn xff0c 运行在32位的时候就叫Wn xff1b AArch32与AArch64寄存器对应关系 xff1a xff08