页面加载中,请稍候
来源:strongerHuang发布时间:2022-10-148090浏览
询问 AI
指令集是一个CPU的基石,要实现CPU 计算和控制功能,就必须定义好一系列与硬件电路相匹配的指令系统.
指令就是我们交代CPU 要执行的操作,指令集就可以简单理解为指令的集合。我们把cpu 能够识别的指令汇总在一起就构成了一个指令集。
不同的CPU 有不同的指令集,根据他们的繁简程度可以分为两种:复杂指令集CISC 和精简指令集 RISC
指令架构(Instruction Set Architecture, 缩写为ISA),是软件和硬件的接口,不同的应用需求,会有不同的指令架构。要设计一款CPU 指令体系就是设计的出发点。
RISC-V 指令有以下特点:
要满足现在操作系统和应用程序的基本运行,RV32G指令集或者RV64G指令集就够了。RV32G和RV64G指令集只有寄存器位宽和寻址大小不同。这些指令按照功能可以分为如下几类:
从上表我们可以看到,RISC-V 指令集具有模块化特点。这就允许我们根据自己的需求,选择一个基础指令集,加上若干个扩展指令集灵活搭配,就可以得到我们想要的指令集架构,进而根据这样的指令架构,设计出贴合我们需求的CPU.
作为初学者,我们了解RISC-V 的核心即可。它的最核心部分是一个基础指令集,叫做RV32I.
RV32I 包含的指令是固定不变的,这为编译器设计人员,操作系统开发人员和汇编语言程序员提供了稳定的基础框架。
RV32I 指令集:

RV32I 指令集如图所示,把带下划线的字母从左至右连接组合就是组成了RV32I指令。{}表示集合中垂直方向的每个项目指令不同变体。变体用下划线字母或者下划线表示表示,如果大括号里面只有下划线,则表示对此变体不需要用字母表示
我们结合具体例子来看:下图表示了bge、blt、bgeu、bltu四个指令。

下图是RISC-V 指令格式,从下图可以看到RSIC-V共六种指令格式。

六种指令格式作用如下:
序号指令类型作用1R 型指令用于寄存器和寄存器操作2I 型指令用于短立即数和内存载入指令load操作3S 型指令用于内存存储store操作4B 型指令用于有条件跳转操作5U 型指令用于长立即数操作6J 型指令用于无条件跳转操作在RISC-V 的规范里面定义了32 个通用寄存器。其中31个是常规寄存器,1个恒为0值的x0寄存器。
0值寄存器是为了满足汇编语言程序员和编译器编写者的使用需要,他们可以使用x0寄存器作为操作数,来完成功能相同的操作。
addix0,x0,0;0=0+0,相当于nop空指令
RSIC-V 寄存器说明
寄存器ABI 名称说明x0zero0值寄存器,硬编码为0,写入数据忽略,读取数据为0x1ra用于返回地址(return address)x2sp用于栈指针(stack pointer)x3gp用于通用指针 (global pointer)x4tp用于线程指针 (thread pointer)x5t0用于存放临时数据或者备用链接寄存器x6~x7t1~t2用于存放临时数据寄存器x8s0/fp需要保存的寄存器或者帧指针寄存器x9s1需要保存的寄存器x10~x11a0~a1函数传递参数寄存器或者函数返回值寄存器x12~x17a2~a7函数传递参数寄存器x18~x27s2-s11需要保存的寄存器x28~x31t3~t6用于存放临时数据寄存器在RV32I 中包括算术指令(add/sub)、数值比较指令(slt)、逻辑指令(and/or/xor)以及移位指令(sll/srl/sra)这几种指令。
这些指令和其他指令集差不多,它们从寄存器读取两个32位的值,并将32位运算结果再写回到目标寄存器。
I型指令:立即数算术运算

R型指令:寄存器与寄存器操作指令

需要指出的是,在寄存器与寄存器操作的算术指令中。必须要有减法指令。这和立即数操作指令不同。
在RISC-V 指令集中,对内存的读写只能通过LOAD 和 STORE 指令实现。而其他的指令只能以寄存器为操作对象。

如上图所示,load 和 store 的寻址模式只能是符号扩展12位的立即数,加上基地址寄存器得到访存的存储器地址。因为没有了复杂的内存寻址方式,这让CPU 流水线可以对数据冲突提前做出判断,并通过流水线各级转送加以处理,而不需要加入空操作(NOP),极大的提高了代码的执行效率。
RV32I 中的条件跳转就是通过比较两个寄存器的值,进行分支跳转:
5.3.2 无条件的分支跳转无条件跳转指令可以细分为直接跳转和间接跳转。直接跳转指令JAL 如下图所示:

间接跳转直接JALR如下:

除了内存地址空间和通用寄存器地址空间外,RISC-V 还定义了一个独立的控制和状态寄存器地址空间(Control Status Register)每个处理器实现的CSR会因设计目标不同而有差异,但是这些CSR的访问方式却是一样的,访问这些CSR指令定义在了用户指令集中(Zicsr指令集扩展)

有了上图这些CSR 指令,能够让我们轻松的访问一些程序性能计数器。这些计数器包括系统时间、时间周期以及执行的指令数目。
延伸阅读:RISC-V-Reader-Chinese-v2p1.pdf


新闻来源:strongerHuang,文中所述为作者独立观点,不代表icspec立场。更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj。
暂无评论哦,快来评论一下吧!
2026-06-01

2026-07-21