RISC-V 指令集介绍
1. 背景介绍
指令集从本质上可以分为复杂指令集(Complex Instruction Set Computer,CISC)和精简指令集(Reduced Instruction Set Computer,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。
指令架构(Instruction Set Architecture, 缩写为ISA),是软件和硬件的接口,不同的应用需求,会有不同的指令架构。
RISC-V的不同寻常之处在于:和几乎所有以往的ISA不同,它是模块化的。它的核心是一个名为RV32I的基础ISA,运行一个完整的软件栈。RV32I是固定的,永远不会改变。这为编译器编写者,操作系统开发人员和汇 编语言程序员提供了稳定的目标。模块化来源于可选的标准扩展,根据应用程序的需要, 硬件可以包含或不包含这些扩展。这种模块化特性使得RISC-V具有了袖珍化、低能耗的特点。
2. RISC-V指令格式
常见的RISC-V指令集如下表所示:
| 基本指令集 | 含义 |
| RV32I | 32位整数指令集 |
| RV32E | RV32I的子集,用于小型嵌入式场景 |
| RV64I | 64位整数指令集,兼容RV32I |
| RV128I | 128位整数指令集,兼容RV64I和RV32I |
RISC-V有六种基本指令格式:
- R-type:用于寄存器-寄存器操作
- I-type:用于短立即数和访存 load 操作
- S-type:用于访存 store 操作
- B-type:用于条件跳转操作
- U-type:用于长立即数
- J-type:用于无条件跳转
指令只有6种格式,并且所有指令都是32位长,指令的低7位固定为opcode,简化了指令解码。在RISC-V中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器,这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位,各种类型的指令构成如下图所示:

字段含义:
- opcode(操作码):指令的基本操作,这个缩写是它惯用名称。
- rd:目的操作寄存器,用来存放操作结果。
- funct3:一个另外的操作码字段。
- rs1:第一个源操作数寄存器。
- rs2:第二个源操作数寄存器。
- funct7:一个另外的操作码字段。
- imm:立即数
2.1. R型指令
32bit R型指令包括6个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- rd (Destination Register)是目的寄存器,位宽5bit,在指令的7-11bit;
- funct3+funct7是两个操作字段。funct3占了3bit,funct7占了7bit;
- rs1 (Source Register 1)是第一个源操作数寄存器,位宽5bit,在指令的15-19bit;
- rs2 (Source Register 2)是第二个源操作数寄存器,位宽5bit,在指令的25-31bit。
R型指令构成如下:

R型的全部指令(RV32I)
R型指令包括加法、减法、逻辑运算、移位运算。
示例:
add a0, a1, a2 //a0 = a1 + a2
sub a0, a1, a2 //a0 = a1 - a2
sll a0, a1, a2 //a0 = a1 << a2(低位补0)
srl a0, a1, a2 //a0 = a1 >> a2(高位补0)
sra a0, a1, a2 //a0 = a1 >> a2 (算术右移,高位补原来的符号位)
slt a0, a1, a2 //a1 < a2 ? a0 = 1 : a0 = 0
xor a0, a1, a2 //a0 = a1 ^ a2
or a0, a1, a2 //a0 = a1 | a2
and a0, a1, a2 //a0 = a1 & a2
2.2. I型指令
I型指令包括5个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- rd (Destination Register)是目的寄存器,位宽5bit,在指令的7-11bit;
- funct3是操作字段。funct3占了3bit,在指令的12-14bit;
- rs1 (Source Register 1)是第一个源操作数寄存器,占了5bit,在指令的15-19bit;
- 存放12位的立即数——imm[11:0],在指令的20-31bit。
I型指令构成如下:

I型的全部指令(RV32I)

I型指令包括立即数的运算和load指令。
示例:
addi a0, a1, 0x5 //a0 = a1 + 0x5
subi a0, a1, 0x05 //a0 = a1 - 0x05
slli a0, a1, 0x05 //a0 = a1 << 0x05(低位补0)
srli a0, a1, 0x05 //a0 = a1 >> 0x05(高位补0)
srai a0, a1, 0x05 //a0 = a1 >> 0x05 (算术右移,高位补原来的符号位)
slti a0, a1, 0x05 //a1 < 0x05 ? a0 = 1 : a0 = 0
xori a0, a1, 0x05 //a0 = a1 ^ 0x05
ori a0, a1, 0x05 //a0 = a1 | 0x05
andi a0, a1, 0x05 //a0 = a1 & 0x05

示例:
lb x10, 0(x1) //将x1的值加上0,将这个值作为地址, 取出这个地址所对应的内存中的值, 将这个值赋值给x10(取出的是8位数值)
lh x10, 0(x1) //从内存中取出16位数值
lw x10, 0(x1) //从内存中取出32位数值
lbu x10, 0(x1) //从内存中取出8位无符号数值
lhu x10, 0(x1) //从内存中取出16位无符号数值
2.3. S型指令
S型指令包括6个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- imm[4:0]+imm[11:5];
- funct3是操作字段。funct3占了3bit,在指令的12-14bit;
- rs1 (Source Register 1)是第一个源操作数寄存器,占了5bit,在指令的15-19bit;
- rs2 (Source Register 2)是第二个源操作数寄存器,占了5bit,在指令的25-31bit。
S型指令构成如下:

S型的全部指令(RV32I)

S型指令包括store指令。
示例:
sb x10, 0(x1) //x1的值加上0,将这个值作为地址, 将x10的值存储到上述地址所对应的内存中去 (只会将x10的值的低8位写入)
sh x10, 0(x1) //只会将x10的值的低16位写入
sw x10, 0(x1) //只会将x10的值的低32位写入
2.4. B型指令
B型指令包括6个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- imm[4:1]+imm[11]+imm[10:5]+imm[12];(注:imm[0]被丢弃,因为它始终为零)
- funct3是操作字段。funct3占了3bit,在指令的12-14bit;
- rs1 (Source Register 1)是第一个源操作数寄存器,占了5bit,在指令的15-19bit;
- rs2 (Source Register 2)是第二个源操作数寄存器,占了5bit,在指令的25-31bit。
B型指令构成如下:

B型的全部指令(RV32I)
B型指令包括条件跳转指令。
示例:
beq a1,a2,Label //if(a1==a2){goto Label;}
bne a1,a2,Label //if(a1!=a2){goto Label;}
blt a1,a2,Label //if(a1< a2){goto Label;}
bgt a1,a2,Label //if(a1> a2){goto Label;}
bge a1,a2,Label //if(a1<=a2){goto Label;}
ble a1,a2,Label //if(a1>=a2){goto Label;}
2.5. U型指令
U型指令包括3个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- rd (Destination Register)是目的寄存器,占了5bit,在指令的7-11bit;
- imm[31:12]:存放高20位的立即数——imm[31:12],在指令的12-31bit。
U型指令构成如下:

U型的全部指令(RV32I)
示例:
lui x10, 0x65432 //得到立即数的高20位,低位补0,立即数范围为:0x00~0xFFFFF
2.6. J型指令
J型指令包括3个部分:
- opcode是操作码,位宽7bit,在指令的0-6bit;
- rd (Destination Register)是目的寄存器,占了5bit,在指令的7-11bit;
- 立即数划分:imm[19:12]+imm[11]+imm[10:1]+imm[20]:
J型指令构成如下:
J型的全部指令(RV32I)

示例:
jal ra, symbol // 跳转到Symbol中去, 并把ra设置成返回地址 Symbol 可以是自定义的Label ,也可以是某个函数名
jal ra, 100 // 跳转到pc + 100 * 2的地方中去, 并把ra设置成返回地址 pc相对寻址,对应的是位置无关代码(PIC)
jalr ra, 40(x10) // 跳转到x10+40 的地方中去, 并把ra设置成返回地址x10+40必须是绝对地址,指向内存中某个确定的地方(往往是函数的开头),非PIC
3. 通用寄存器
RV32I有32个通用寄存器,以及一个PC寄存器。其中有一个通过硬件设置的值恒为 0 的 x0 寄存器

注:RISC-V的32个寄存器x0~x31是用0~31这些数字来表示。
参考文档、博客:
RISC-V官方文档
riscv指令集基础_konghhhhh的博客-CSDN博客
计算机系统基础(五)之RISC-V指令集_riscv指令集_深度学习的学习僧的博客-CSDN博客
RISC-V指令集_riscv指令集_点灯大师~的博客-CSDN博客
相关文章:
RISC-V 指令集介绍
1. 背景介绍 指令集从本质上可以分为复杂指令集(Complex Instruction Set Computer,CISC)和精简指令集(Reduced Instruction Set Computer,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…...
操作系统5
设备管理 I/O设备 什么是?--- 将数据Input/Output(输入/输出)计算机的外部设备。 分类: 按使用特性:人机交互类外设、存储设备、网络通信设备; 按传输速度:低速、中速、高速设备࿱…...
K8S系列文章之 Docker常用命令
一、镜像基础命令: $ docker info # 查看docker信息 $ docker system df # 查看镜像/容器/数据卷所占的空间。 $ ip addr #查看容器内部网络地址。 $ docker images # 查看镜像 $ docker search 镜像名称 # 搜索镜像 --limit :只列出N个镜像,默认为25个…...
谷歌: 安卓补丁漏洞让 N-days 与 0-days 同样危险
近日,谷歌发布了年度零日漏洞报告,展示了 2022 年的野外漏洞统计数据,并强调了 Android 平台中长期存在的问题,该问题在很长一段时间内提高了已披露漏洞的价值和使用。 更具体地说,谷歌的报告强调了安卓系统中的 &quo…...
linux 学成之路(基础篇)(二十三)MySQL服务(下)
目录 一、用户权限管理概述 二、用户权限类型 三、用户赋予权限 四、删除权限 五、删除用户 一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面,它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和…...
MySQL初探
Background 通过阅读小林coding,大致了解了mysql数据库的种种特点,与之前学的数据库实现大体思路相同,感觉学习不能停留在理论层面,要调研生产级别的中间件实现。 一条代码运行在mysql上的流程 1. 连接的过程需要先经过 TCP 三次…...
blender 用蒙版添加材质
一、添加材质常规方法 选择物体新建材质,shift a 新建图像纹理,此时会发现添加上的纹理会有接缝,shift a 新建映射 纹理坐标,纹理坐标选择生成,此时,之前的接缝便会消失; 如何快捷添加纹理坐…...
前端面试的性能优化部分(2)每篇10题
1. 常见的图片格式及使用场景 常见的图片格式有 JPEG、PNG、GIF、WebP 和 SVG,它们各有适用的使用场景: JPEG (Joint Photographic Experts Group): 使用场景:适用于照片和真实场景的图片,特别是色彩丰富和渐变丰富的…...
Spring——Spring是什么?IoC容器是什么?
文章目录 前言一、Spring是什么1.IoC 容器 —— 容器2.IoC 容器 —— IoC传统程序开发控制反转式程序开发 3.Spring IoC 二、DI是什么总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话,互关一下…...
【CNN-BiLSTM-attention】基于高斯混合模型聚类的风电场短期功率预测方法(Pythonmatlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
golang深刻剖析——channel
文章目录 1 概念2 分类3 操作3.1 channel 的创建3.1.1 无缓冲channel3.1.1 带缓冲channel 3.2 channel的读写3.3 channel的关闭3.4 channel 和 select 4 channel 底层原理 1 概念 channel 是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队…...
ERROR in unable to locate ‘***/public/**/*‘ glob
前提 自己搭了一个react项目的脚手架,npm包下载一切都很正常,启动的时候突然就报ERROR in unable to locate ***/public/**/* glob这个错误,根据百度分析了一下产生的原因:webpack配置文件中的CopyWebpackPlugin导致的 网上给出的…...
简述一下你了解的 Java 设计模式
创建型模式 ★单例模式:保证某个类只能有一个唯一实例,并提供一个全局的访问点。 ★简单工厂:一个工厂类根据传入的参数决定创建出那一种产品类的实例。 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。 抽…...
[开发] 认证的几种方式简介
LDAP 认证 LDAP(轻量级目录访问协议)是一种用于访问和维护分布式目录信息的开放标准协议。它最初由电子数据系统公司(Netscape)开发,现在被广泛用于企业和组织中的身份认证和授权管理。LDAP的目标是为不同类型的应用程…...
ansible-playbook roles模块编写lnmp剧本
目录 一:集中式编写lnmp剧本 二:分布式安装lnmp 1、nginx 配置 2、mysql配置 3、php配置 4、运行剧本 一:集中式编写lnmp剧本 vim /etc/ansible/lnmp.yml- name: lnmp playhosts: dbserversremote_user: roottasks:- name: perpare condif…...
什么是汽车软件的模糊测试?
汽车软件的模糊测试(fuzz testing)是一种在软件开发过程中用来发现潜在漏洞和缺陷的测试方法。它通过输入大量的随机、无效或异常数据来模拟真实环境中各种可能的异常情况,以测试软件的健壮性和稳定性。 1. 确定模糊测试的目标:确…...
Datax使用
参考文档 datax 安装包 安装包 安装java sudo yum install java-1.8.0-openjdk sudo yum install java-1.8.0-openjdk-develvim /etc/profileexport JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64 export PATH$JAVA_HOME/bin:$PATHsource /etc…...
HTML不常用但是好用的标签
sub sup <p>这个文本包含 <sub>111</sub>文本。</p> <p>这个文本包含 <sup>上标</sup> 文本。</p>下标文本将会显示在当前文本流中字符高度的一半为基准线的下方,但是与当前文本流中文字的字体和字号都是一样的。…...
蓝桥杯2018省赛全球变暖dfs
全球变暖 问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序 问题描述 格式输入 格式输出 输出一个整数 样例输入 样例输出 1 评测用例规模与约定 最大运行时间:1s最大运行内存: 256M 解析 采用dfs的方式进行搜索,首先输入地…...
Bean的作用域 - spring
前言 本篇介绍Bean的6种作用域,与通过注释修改作用域的方式,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1. Bean的作用域1.1 singleton - 单例模式 - 默认作用域1.2 prototype - 原型…...
从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战
从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战 当Scratch积木块拼接的机械臂动作开始显得单调时,便是时候揭开底层控制的神秘面纱了。本文将带您跨越图形化编程的舒适区,用树莓派的Python环境重新定义LeArm机械臂的智能—…...
NVIDIA Profile Inspector终极显卡优化工具:简单易用的性能调校完整指南
NVIDIA Profile Inspector终极显卡优化工具:简单易用的性能调校完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector NVIDIA Profile Inspector是一款专业的显卡优化工具,专为…...
激光切割外壳设计全流程:从创客工具到产品级制造的实战指南
1. 项目概述:为什么选择激光切割来做外壳?如果你和我一样,捣鼓过不少电子项目,从简单的Arduino温湿度计到复杂的树莓派家庭服务器,那你一定为“给它们找个家”这件事头疼过。3D打印太慢,开模注塑成本又高得…...
为AI编程助手构建安全防线:Cursor自定义规则实战指南
1. 项目概述:为AI编程助手装上“安全护栏” 如果你和我一样,深度使用Cursor这类AI编程助手,那你一定体验过它带来的效率革命。它能帮你生成代码、重构函数、甚至解释复杂的逻辑,就像一个不知疲倦的编程伙伴。但硬币总有另一面——…...
AXI交叉开关IP核:SoC内部高并发数据传输的核心枢纽设计与实战
1. 项目概述:一个高效、可配置的片上总线交叉开关在复杂的数字系统设计,尤其是片上系统(SoC)领域,多个主设备(如CPU、DMA控制器)需要同时访问多个从设备(如内存、外设控制器…...
别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码)
别再手动调色了!用Matlab bar3函数一键生成论文级渐变三维柱状图(附完整代码) 科研图表的美观程度直接影响论文的第一印象,而三维柱状图在展示多维度数据时尤为常见。传统手动调整每个柱体的颜色、透明度、光照效果不仅耗时&#…...
湿版摄影×AI生成革命:为什么93%的MJ用户调不出真实碘化银斑痕?——资深暗房师+AI训练师双视角深度拆解
更多请点击: https://intelliparadigm.com 第一章:湿版摄影AI生成革命:为什么93%的MJ用户调不出真实碘化银斑痕?——资深暗房师AI训练师双视角深度拆解 湿版火棉胶摄影术诞生于1851年,其不可复制的物理噪点——由碘化…...
AI项目脚手架:标准化与自动化提升工程效率
1. 项目概述:一个为AI项目量身定制的“脚手架”如果你和我一样,在AI领域摸爬滚打多年,从早期的机器学习模型到现在的深度学习、大语言模型应用,肯定经历过无数次从零开始搭建项目的“阵痛”。每次新建一个项目,都要重复…...
IE11富文本兼容——政务系统前端的深渊
IE11富文本兼容——政务系统前端的深渊 背景:为什么还有 IE11 系统要求支持 IE11。 为什么不是 Chrome? 办公电脑全是 Windows 7 IE11单位统一采购,不能随便装浏览器部分内部网站只支持 IE(ActiveX) 现状&#x…...
开源提示词管理工具:本地化部署与AI工作流效率提升实践
1. 项目概述:一个为AI工作流设计的提示词管理利器如果你和我一样,每天都在和ChatGPT、Claude、Midjourney这些AI模型打交道,那你一定有过这样的烦恼:昨天精心调试好的、能稳定输出高质量代码的提示词,今天想用的时候&a…...
