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

ARMv8寄存器的介绍

一、寄存器的作用

寄存器是CPU的内部组成单元,是CPU运算时取指令和数据最快的地方。它可以用来暂存指令、数据和地址。在CPU的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。CPU的算术逻辑部件中,包含的寄存器有累加器(ACC),具体的有:

  • 高速访问:寄存器是CPU内部最快的存储单元,比主存(RAM)和缓存(Cache)访问速度更快,通常在一个时钟周期内完成读写操作。
  • 减少等待时间:频繁使用寄存器进行数据存储和操作,减少了对主存的访问,避免了长时间的等待,从而提高了处理速度。
  • 简化指令执行:寄存器直接存储操作数和计算结果,使指令执行更简便,不需要频繁从内存读取数据,简化了指令的执行流程。
  • 并行处理:寄存器支持多条指令的并行执行,通过寄存器重命名技术
  • 避免数据相关性问题,提高指令级并行性和处理器的整体吞吐量。
  • 减少总线冲突:使用寄存器操作数据可以减少总线访问频率,降低总线冲突,提高系统的整体性能和响应速度。

二、寄存器(Register)与寄存器组结构

寄存器结构

每个寄存器由多个触发器组成,输入数据通过写使能信号控制是否写入新值。读出数据通过读口送出。当写使能(Write Enable)为0时,时钟边沿到来时输出不变;当写使能信号为1时,时钟边沿到来时输出开始变为输入。若每个时钟边沿都写入,则不需要Write Enable信号。

寄存器组结构
寄存器组由多个寄存器组成,每个寄存器都可以通过编号来定位。N位编号可以表示2的N次方个寄存器,而M个寄存器的位数则是log M的上取整。

三、ARMv8寄存器介绍

ARMv8中有34个寄存器,包括31个64 位通用寄存器、1个64 位的程序计数(Program Counter, PC)指针寄存器、栈指针(StackPointer, SP)寄存器以及异常链接寄存器(Exception Link Register, ELR),一个处理器状态寄存器PSTATE来表示当前的处理器状态(processor state),

1、通用寄存器
AArch64执行状态支持31个64位的通用寄存器,分别是X0-X30寄存器,而AArch32状态支持16个32位的通用寄存器。除用于数据运算和存储之外,通用寄存器还可以在函数调用过程中起到特殊作用,ARM64体系结构的函数调用标准和规范对此有所约定,如下图所示。

  • X0-X7  用于参数传递
  • X9-X15  在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低 在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低
  • X19-X29 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre 在callee子函数中使用这些寄存器时,需要先save这些寄存器,在退出子函数时再resotre
  • X8, X16-X18, X29, X30  这些都是特殊用途的寄存器 – X8: 用于返回结果 – X16、X17 :进程内临时寄存器 – X18 :resrved for ABI – X29 :FP(frame pointer register) – X30 :LR

在 AArch64 状态下,使用 X(如 X0、 X30 等)表示 64 位通用寄存器。另外,还可以使用
W 来表示低 32 位的数据,如 W0 表示 X0 寄存器的低 32 位数据, W1 表示 X1 寄存器的低 32
位数据,
 

2、PSTATE寄存器

AArch64 体系结构使用 PSTATE 寄存器来表示当前处理器状态(processor state),PSTATE的主要字段

  • N(Negative):负数标志位,结果为负数时置1。
  • Z(Zero):零标志位,结果为零时置1。
  • C(Carry):进位标志位,算术运算发生进位时置1。
  • V(Overflow):溢出标志位,算术运算发生溢出时置1。
  • EL(Exception Level):异常级别,指示当前的异常处理级别。
  • SP(Stack Pointer Select):栈指针选择,指示当前使用的栈指针(SP_EL0或SP_ELx)。

3、特殊寄存器

ARMv8架构中还有一些专用寄存器,用于特定功能和操作。主要的专用寄存器包括:

  1. SP_ELx(Stack Pointer Registers for Exception Levels):每个异常级别都有独立的栈指针寄存器(SP_EL0, SP_EL1, SP_EL2, SP_EL3)。
  2. ELR_ELx(Exception Link Registers for Exception Levels):每个异常级别都有独立的异常链接寄存器(ELR_EL1, ELR_EL2, ELR_EL3),用于存储异常返回地址。
  3. SPSR_ELx(Saved Program Status Registers for Exception Levels):每个异常级别都有独立的保存程序状态寄存器(SPSR_EL1, SPSR_EL2, SPSR_EL3),用于保存异常发生时的PSTATE值。

4、系统寄存器

系统寄存器用于控制和管理CPU的操作模式、特权级别、内存管理、中断处理等关键系统功能。主要的系统寄存器包括:

  1. SCTLR_ELx(System Control Register):系统控制寄存器,用于控制和配置处理器的系统级特性,如内存保护、缓存策略等。
  2. TTBR0_ELx(Translation Table Base Register):转换表基地址寄存器,用于定义页表的基地址,支持内存地址转换和虚拟内存管理。
  3. MAIR_ELx(Memory Attribute Indirection Register):内存属性指示寄存器,用于定义不同内存区域的属性,如缓存策略、访问权限等。
  4. TCR_ELx(Translation Control Register):转换控制寄存器,用于控制地址转换的行为和特性,如地址范围、页大小等。
  5. ESR_ELx(Exception Syndrome Register):异常综合症寄存器,用于存储异常发生时的状态信息,帮助调试和错误处理。

 程序可以通过 MSR 和 MRS 指令访问系统寄存器。

mrs X0, TTBR0_EL1 //把 TTBR0_EL1 的值复制到 X0 寄存器
msr TTBR0_EL1, X0 //把 X0 寄存器的值复制到 TTBR0_EL1

参考:

https://mbd.baidu.com/newspage/data/dtlandingsuper?nid=dt_4088083317822557806&sourceFrom=search_a

https://zhuanlan.zhihu.com/p/711014643

ARMv8寄存器详解-CSDN博客


http://www.mrgr.cn/news/93639.html

相关文章:

  • PAT乙级真题(2014·冬)
  • 【CSS3】基础篇
  • #UVM# 关于 config_db 机制中的直线非直线设置和获取讲解
  • 【Deepseek应用】Zotero+Deepseek 阅读和分析文献(下)
  • linyu-im
  • powershell@宝塔面板批量建站脚本@批量设置@批量部署伪静态设置
  • three.js 在 webGL 添加纹理
  • Linux教学总目录
  • #UVM# 关于 config_db 机制中省略 get 语句的条件
  • 扎实基础:测试工作的基石
  • C++学习之QT基础
  • 【GPT入门】第8课 大语言模型的自洽性
  • 力扣203题:移除链表元素及代码实现分析
  • name ‘bare_metal_version‘ is not mamba_ssm安装
  • Redis|Springboot集成Redis
  • 完整版已注册,永久授权!
  • 计算机毕业设计SpringBoot+Vue.js车辆管理系统(源码+文档+PPT+讲解)
  • C语言学习笔记-进阶(7)字符串函数3
  • Day04 模拟原生开发app过程 Androidstudio+逍遥模拟器
  • 安装完flash-attn,使用时报错undefined symbol