一起学RISC-V汇编第3讲之寄存器

寄存器是处理器中最常用的处理单元,RISC-V指令的操作数除了立即数就是寄存器。

RISC-V指令集包含了多种不同类型的寄存器,用于不同目的和功能:

对于rv32imafd架构而言,包含如下寄存器:

  • 通用寄存器:32个通用整数寄存器,分别标记为x0-x31,如果是fd扩展,还有32 个独立的浮点寄存器,分别标记为f0-f31
  • 控制与状态寄存器CSR:用来记录或配置一些CPU的运行状态
  • 独立的程序计数器PC

1 通用寄存器

1.1 通用整数寄存器

RISC-V 架构提供32个通用寄存器x0-x31,其中x0 有些特殊,x0 寄存器被设置为硬件连线的常数0,读恒为0,写无效,这个寄存器在一些地方很有作用,因为程序运行中常数0的使用频率非常高,所以专门用一个寄存器来存放常数0,并没有浪费寄存器数量,并且使得编译器工作更加简便,这一点也是RISC-V架构优雅性的体现,比如后面讲到的伪指令。

下图来自riscv spec,附带PC寄存器(程序计数器,用来存储指向下一条指令的地址),寄存器的长度XLEN与架构有关(对于rv32:XLEN=32,对于rv64:XLEN=64)。
标量整数寄存器

对于这些通用寄存器,除了x0外(x0 寄存器的值读恒为0,写无效),其它寄存器都本质上是等价的。但在实际使用过程中,我们约定了这些寄存器的用法,即ABI规范,见下表,我们将x0-x31以及f0-f31 按照常用功能分别取了别名,附带有简单的描述,在汇编中使用原名和别名是等价的,比如:在汇编中我们使用x1或使用ra,编译器都是认识的,建议写汇编时使用别名,这样方便我们阅读代码,关于表中ABI的描述以及Caller Callee的概念见后续章节。
寄存器ABI别名

将上表重新抄录如下:

寄存器 ABI 名称 描述 Saver
x0 zero 零值 -
x1 ra 返回地址 Caller
x2 sp 堆栈指针 Callee
x3 gp 全局指针 -
x4 tp 线程指针 -
x5 t0 临时/备用链接寄存器 Caller
x6-x7 t1-t2 临时寄存器 Caller
x8 s0/fp 保存寄存器/帧指针 Callee
x9 s1/gp 保存寄存器/全局指针 Callee
x10-x11 a0-a1 函数参数/返回值 Caller
x12-x17 a2-a7 函数参数 Caller
x18-x27 s2-s11 保存寄存器 Callee
x28-x31 t3-t6 临时寄存器 Caller

1.2 通用浮点寄存器

对于带有fpu的架构,如rv32imafd 或 rv64imafd(F表示单精度浮点,D表示双精度浮点,D扩展依赖于F扩展) 架构处理器而言,它们有32个浮点寄存器,见下图,浮点寄存器长度FLEN与"F" 或 “D”扩展有关,对于“F扩展”,无论是rv32imaf还是 rv64imaf架构,FLEN = 32,而对于“D扩展”,无论是rv32imafd还是 rv64imafd,FLEN=64。这一点与通用寄存器是不同的。
通用浮点寄存器

同样的,在实际使用过程中,我们约定了这些浮点寄存器的用法,见下表。

寄存器 ABI 名称 描述 Saver
f0-f7 ft0-ft7 浮点 临时存储 Caller
f8-f9 fs0-fs1 浮点 保存的寄存器 Callee
f10-f11 fa0-fa1 浮点 函数参数/返回值 Caller
f12-f17 fa2-fa7 浮点 函数参数 Caller
f18-f27 fs2-fs11 浮点 保存的寄存器 Callee
f28-f31 ft8-ft11 浮点 临时存储 Caller

查看XLEN与FLEN:

如下,我们可以查看riscv 编译器定义的xlen与flen宏,来了解XLEN与FLEN的差异,简单来说:xlen取决于是rv32还是rv64,flen取决于是F扩展还是D扩展。

$ riscv64-unknown-elf-gcc -march=rv32imafc -mabi=ilp32f -dM -E - < /dev/null | grep len
#define __riscv_xlen 32
#define __riscv_flen 32
$ riscv64-unknown-elf-gcc -march=rv32imafdc -mabi=ilp32d -dM -E - < /dev/null | grep len
#define __riscv_xlen 32
#define __riscv_flen 64
$ riscv64-unknown-elf-gcc -march=rv64imafc -mabi=lp64f -dM -E - < /dev/null | grep len
#define __riscv_xlen 64
#define __riscv_flen 32
$ riscv64-unknown-elf-gcc -march=rv64imafdc -mabi=lp64d -dM -E - < /dev/null | grep len
#define __riscv_xlen 64
#define __riscv_flen 64

2 控制状态寄存器CSR

RISC-V 定义了控制和状态寄存器CSR (Control and Status Register),用于配置或记录处理器的运行状态, RISC-V 特权指令就是通过控制CSR来实现的。CSR 使用专有的 12 位地址空间,因此理论上能够支持最多 4096 个 CSR。但实际上,这个地址空间大部分是空的,RISC-V 手册中实际只定义了数十个 CSR,访问不存在的 CSR 将触发无效指令异常。

CSR寄存器的种类:

RISC-V 的 CSR 寄存器非常多,在机器模式(Machine Mode)下这些存储器主要包括以下六类:

  • 处理器信息相关:如:MHARTID(Machine Hartid),表示机器模式信息寄存器组
  • 中断配置相关:如:MIE(Machine Interrupt Enable), MTVEC(Machine Trap Vector)等
  • 异常处理相关:如:MCAUSE(Machine Cause), MTVAL(Machine Trap Value),MSTATUS(Machine Status)等
  • 存储器保护相关:设置不同地址空间的存储器的访问属性,例如可读可写可执行等等。
  • 性能统计相关和调试接口相关,如MCYCLE(Machine Cycle)等。

CSR寄存器列表如下:

寄存器名称 全称 作用
处理器信息相关寄存器
misa Machine ISA Register 机器模式指令集架构寄存器,可以查看处理器的位宽,以及所支持的扩展
mvendorid Machine Vendor ID Register 机器模式供应商编号寄存器
marchid Machine Architecture ID Register 机器模式架构编号寄存器
mimpid Machine Implementation ID Register 机器模式硬件实现编号寄存器
mhartid Hart ID Register Hart编号寄存器
中断配置相关寄存器
mie Machine Interrupt Enable Registers 机器模式中断使能寄存器,维护处理器的中断使能状态
mip Machine Interrupt Pending Registers 机器模式中断等待寄存器,记录当前的中断请求
mtvec Machine Trap-Vector Base-Address Register 机器模式异常入口基地址寄存器,低2位可以设置为直接模式或向量模式
异常处理相关寄存器
mcause Machine Cause Register 机器模式异常原因寄存器
mtval Machine Trap Value Register 又名mbadaddr, 机器模式异常值寄存器,存放当前自陷相关的额外信息,如地址异常的故障地址、非法指令异常的指令,发生其他异常时其值为 0
mstatus Machine Status Registers 机器模式状态寄存器
mepc Machine Exception Program Counter 机器模式异常PC寄存器,指向发生异常的指令
性能统计相关
mtime Machine Timer Registers 机器模式计时寄存器
mcycle Cycle counter cycle 计数器(rv32 寄存器值为32位,需配合mcycleh使用,rv64 寄存器值为64位)
mcycleh Cycle counter cycle 计数器高32位(rv64 无)

CSR寄存器的读写

访问CSR寄存器需要特别的CSR指令,CSR 指令在 RISC-V 的 Zicsr 扩展模块中定义。

3 程序计数器PC

有些处理器架构中用通用寄存器来存放PC,这样使用普通的指令即可改变PC值,从而引起跳转,这样并不是一个很好的做法,RISC-V中,定义了独立的程序计数器,可以通过专门的指令(AUIPC)来间接获取PC值。

参考:

  1. 《riscv-spec-20191213.pdf》
  2. 3、寄存器 — RISC-V RT-Thread 编程指南 0.0.1 文档 (riscv-rtthread-programming-manual.readthedocs.io)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三期 Plugins Function Calling

大模型的缺陷:没有最新消息:训练周期长且昂贵,GPT3.5/4的知识截至2021-9 没有真逻辑:表现出的逻辑和推理,是训练文本的统计规律,不是真正的逻辑Plugins 订机票、数学计算、日程提醒... 插件选择&使用插件的原理 通过prompt判断是否应该调用插件失败使用门槛高:用户需…

第四期 AI 编程

目标如何用 AI 辅助编程,提升工作效率 如何用 AI 快速应用和学习新技术,扩展职业边界 通过 AI 编程,洞察 AI 对各个行业的影响趋势产品与技术的联通+业务视角 =AI 全栈工程师 AI 编程 使用 AI 编程(编程目前是大模型能力最强的垂直领域),除了解决编程问题以外,更重要是建…

Linux调度器:进程优先级

一、前言 本文主要描述的是进程优先级这个概念。从用户空间来看,进程优先级就是nice value和scheduling priority,对应到内核,有静态优先级、realtime优先级、归一化优先级和动态优先级等概念,我们希望能在第二章将这些相关的概念描述清楚。为了加深理解,在第三章我们给出…

中山大学人工智能夏令营实践课

Day 0 配置wsl的 vscode环境 (速通速通!) Day 1 上午讲了中山大学的校史以及鸿蒙系统的大体介绍 感慨: 作为互联网原生的一代,是最具创造性的一代,通过我们的夏令营不仅可以锻练我们的技术能力,开发能力,沟通能力,从而让自己链接的能力超出自已的物理空间。还可以提升…

微调(Fine-Tuning)和检索增强生成(RAG)

微调(Fine-Tuning)和检索增强生成(RAG) https://www.toutiao.com/article/7386094597421810186/?log_from=21b91ee0752_17211185181952024-06-30 09:05架构笔记 微调(Fine-Tuning)过程的核心,是在新的任务和数据集上对预训练模型的参数进行微小的调整,使其能精准契合…

为视觉语言多模态模型进行偏好优化

为视觉语言多模态模型进行偏好优化 训练模型使得它能够理解并预测人类偏好是一项比较复杂的任务。诸如 SFT (Supervised finetuning) 的传统的方法一般都需要耗费较大成本,因为这些算法需要对数据打上特定的标签。而偏好优化 (Preference Optimization) 作为一种替代选项,通常…

别小瞧它,提高效率可了解可拖拽的工作流引擎

提升效率,可以随时来了解低代码技术平台、可拖拽的工作流引擎更多特点。当前,社会发展程度越来越高,很多企业都希望寻求更优的平台产品实现提质增效的目的。低代码技术平台、可拖拽的工作流引擎具有可视化操作界面、更灵活、好操作等多个优势特点,在提升办公效率方面具有事…

fastqc和Trimmomatic的使用

1.FastQC分析检测报告 在先前的记录中,我们已经得到了我们的QC报告,现在要针对我们的报告对原始数据进行过滤 其中 和 都表明该数据需要去接头,并对序列进行处理 2.Trimmomatic的下载 首先,使用conda安装Trimmomatic conda install Trimmomatic 就可以安装完毕了,安装完使…

数据仓库建模工具之一——Hive学习第二天

Hive的概述 1、Hive基本概念 1.1 Hive简介Hive本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据存储,说白了hive可以理解为一个将SQL转换为MapReduce的任务的工具,甚至更近一步说hive就是一个MapReduce客户端。 为什么使用Hive?使用hadoop,成本太高,项目要…

三分钟了解自定义表单自定义工作流的多个优势

如果想了解自定义表单自定义工作流的优势特点,可以通过本文获取更多详情信息。降本、提高效率、解决信息孤岛是很多企业亟需要解决的问题。什么样的软件平台可以实现这一目标?可以随时来了解低代码技术平台。它当中的自定义表单自定义工作流拥有多个优势特点,可以为企业降低…

jenkins+allure常见问题汇总

1.生成allure报告时,报Can not find any allure commandline installation. 原因:jenkins下载安装allure插件后,没有配置allure路径 解决办法:Manage Jenkins>Tools>Allure Commandine安装2.执行pytest --alluredir=./allure-result --clean-alluredir时,报error: u…