RISC-V指令集之RV32I

RISC-V指令集之RV32I

  • 1 RV32I的寄存器
  • 2 RV32I的指令
    • 2.1 算术运算指令
    • 2.2 逻辑运算指令
    • 2.3 移位运算指令
    • 2.4 内存读写指令
    • 2.5 分支与跳转指令

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 RV32I的寄存器

如下图,列出了RV32I 寄存器和由RISC-V 应用程序二进制接口(Application Binary Interface,ABI)定义的寄存器名称。我们将在示例代码中使用ABI 名称来提升可读性。
在这里插入图片描述
在RISC-V 的规范里面,RV32I定义了32 个通用寄存器,其中31个是常规寄存器,1个恒为0值的x0寄存器。

2 RV32I的指令

RV32I具备的所有指令,如下所示。
在这里插入图片描述
这里展示了RV32I指令集的每一条指令,并且每条指令的具体格式,以及指令类型。

RV32I指令集,一共包含了47条指令,分别涵盖了数据传输、算术运算、逻辑运算、分支跳转、比较判断等功能。

我们按不同类型,划分来看:
在这里插入图片描述

2.1 算术运算指令

算术运算指令,有add、sub、addi、lui、auipc,其指令形式与含义,如下所示:

指令形式功能说明
add rd, rs1, rs2rd = rs1 + rs2
sub rd, rs1, rs2rd = rs1 - rs2
addi rd, rs1, immrd = rs1 + imm
lui rd, immrd = imm << 12
auipc rd, immrd = PC + (imm << 12)

2.2 逻辑运算指令

逻辑运算指令,有xor、or、and、xori、ori、andi,其指令形式与含义,如下所示:

指令形式功能说明
xor rd, rs1, rs2rd = rs1 ^ rs2,表示rs1与rs2按位异或,结果存入rd
or rd, rs1, rs2rd = rs1 \ rs2,表示rs1与rs2按位或,结果存入rd
and rd, rs1, rs2rd = rs1 & rs2,表示rs1与rs2按位与,结果存入rd
xori rd, rs1, immrd = rs1 ^ imm,表示rs1与imm按位异或,结果存入rd
ori rd, rs1, immrd = rs1 \ imm,表示rs1与imm按位或,结果存入rd
andi rd, rs1, immrd = rs1 & imm,表示rs1与imm按位与,结果存入rd

2.3 移位运算指令

移位运算指令,有sll、srl、sra等,共10条,其指令形式与含义,如下所示:

指令形式功能说明
sll rd, rs1, rs2rd = rs1 << rs2,表示将rs1逻辑左移,左移位数为rs2,结果存入rd
srl rd, rs1, rs2rd = rs1 >> rs2,表示将rs1逻辑右移,右移位数为rs2,结果存入rd
sra rd, rs1, rs2rd = rs1 >> rs2,表示将rs1算术右移,右移位数为rs2,结果存入rd
slt rd, rs1, rs2rd = (rs1 < rs2) ? 1:0,表示rs1小于rs2,则将1写入rd,否则将0写入rd
sltu rd, rs1, rs2rd = (rs1 < rs2) ? 1:0,表示无符号的rs1小于rs2,则将1写入rd,否则将0写入rd
slli rd, rs1, immrd = rs1 << imm[0:4],表示将rs1逻辑左移,左移位数为imm,结果存入rd
srli rd, rs1, immrd = rs1 >> imm[0:4],表示将rs1逻辑右移,右移位数为imm,结果存入rd
srai rd, rs1, immrd = rs1 >> imm[0:4],表示将rs1算术右移,右移位数为imm,结果存入rd
slti rd, rs1, immrd = (rs1 < imm) ? 1:0,表示rs1小于imm,则将1写入rd,否则将0写入rd
sltiu rd, rs1, immrd = (rs1 < imm) ? 1:0,表示无符号的rs1小于imm,则将1写入rd,否则将0写入rd

2.4 内存读写指令

RV32I数据读写指令,可以从内存中加载数据到寄存器,或者将寄存器值存储到内存。亦或者将数据从一个寄存器复制到另一个。或者将立即数或标签地址加载到寄存器。

RV32I内存读写指令,有lb、lh、lw等,共8条,其指令形式与含义,如下所示:

指令形式功能说明
lb rd, imm(rs1)rd = M[rs1+imm][0:7],表示从内存地址(rs1+imm)中,加载一个8位有符号字节到寄存器rd
lh rd, imm(rs1)rd=M[rs1+imm][0:15],表示从内存地址(rs1+imm)中,加载一个16位有符号半字到寄存器rd
lw rd, imm(rs1)rd = M[rs1+imm][0:31],表示从内存地址(rs1+imm)中,加载一个32位有符号或无符号字到寄存器rd
lbu rd, imm(rs1)rd = M[rs1+imm][0:7],表示从内存地址(rs1+imm)中,加载一个8位无符号字节到寄存器rd
lhu rd, imm(rs1)rd = M[rs1+inm][0:15],表示从内存地址(rs1+imm)中,加载一个16位无符号半字到寄存器rd
sb rs2, imm(rs1)M[rs1+imm][0:7] = rs2[0:7],表示将rs2中的最低8位值,存储到(rs1+imm)地址的内存中
sh rs2, imm(rs1)M[rs1+imm][0:15] = rs2[0:15],表示将rs2中的最低16位值,存储到(rs1+imm)地址的内存中
sw rs2, imm(rs1)M[rs1+imm][0:31] = rs2[0:31],表示将rs2中的最低32位值,存储到(rs1+imm)地址的内存中

2.5 分支与跳转指令

条件跳转指令,是依据指令中的条件来决定跳转。换句话说就是,通过判断条件来决定是否改变当前执行流程。

RV32I分支与跳转指令,有beq、bne、blt等,共8条,其指令形式与含义,如下所示:

指令形式功能说明
beq rs1, rs2, immif(rs1 == rs2) PC+=imm,表示如果rs1等于rs2,则跳转到PC+imm
bne rs1, rs2, immif(rs1 != rs2) PC+=imm,表示如果rs1不等于rs2,则跳转到PC+imm
blt rs1, rs2, immif(rs1 < rs2) PC+=imm,表示如果有符号的rs1小于rs2,则跳转到PC+imm
bge rs1, rs2, immif(rs1 >= rs2) PC+=imm,表示如果有符号的rs1大于等于rs2,则跳转到PC+imm
bltu rs1, rs2, immif(rs1 < rs2) PC+=imm,表示如果无符号的rs1小于rs2,则跳转到PC+imm
bgeu rs1, rs2, immif(rs1 >= rs2) PC+=imm,表示如果无符号的rs1大于等于rs2,则跳转到PC+imm
jal rd, immrd = PC+4; PC += imm,表示首先将PC+4的地址值存储到寄存器rd,然后跳转到PC+imm处
jalr rd, imm(rs1)rd = PC+4; PC= rs1 + imm,表示首先将PC+4的地址值存储到寄存器rd,然后跳转到rs1+imm处

关于跳转指令,还有几条常用伪指令:

指令形式功能说明
j lab跳转到lab标签地址处
jr rs1跳转到寄存器rs1指定的地址
jal lab首先将PC+4的地址值存储到返回寄存器ra,然后跳转到lab标签处
ret跳转到返回寄存器ra保存的地址

通过上述内容的学习,我们了解了RV32I指令集有哪些指令,以及这些指令的字节码(机器码)构成。

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

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

相关文章

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度&#x1f496; Code 思路 &#x1f468;‍&#x1f3eb; 参考 大根堆维护较小值&#xff08;堆顶即中位数&#xff09;&#xff0c;小根堆维护较大值&#xff08;堆顶可能是中位数之一&#xff09;维护小堆长度较长&#x…

idea搭建spring5.3.x源码环境

1.写在前面的话 碰到了不少想阅读或者学习spring源码的同学&#xff0c;但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支&#xff0c;来具体演示一下搭建过程。 2. 下载源码 下载源码这一步&#xff0c;说实话&#xff0c;由于某些原…

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …

并查集(高阶数据结构)

目录 一、并查集的原理 二、并查集的实现 2.1 并查集的初始化 2.2 查找元素所在的集合 2.3 判断两个元素是否在同一个集合 2.4 合并两个元素所在的集合 2.5 获取并查集中集合的个数 2.6 并查集的路径压缩 2.7 元素的编号问题 三、并查集题目 3.1 省份的数量 3.2 等…

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据&#xff0c;构建机器学习分类模型并将模型结果可视化展示&#xff0c;具体链接如下&#xff1a; 机器学习和可视化还能一起这样用&#xff1f;Python教你全搞定。今天这篇推文&#xff0c;我们就使用R语言的kknn包进行类…

【2023地理设计组一等奖】基于机器学习的地下水仿真与时空分析

作品介绍 1 设计思想 1.1 作品背景 华北平原是我国最重要的粮棉产地之一,然而近年来农业的低效用水以及过度压采正逐步加剧其地下水资源的紧张性,为经济可持续发展带来重大风险。而地下水动态变化与人为干预、全球气候波动呈现出高度相关性,因此,地下水的仿真模拟对保障粮…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境&#xff0c;所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境&#xff0c;所以首…

sql注入之GETSHELL

2024.2.1 GETSHELL 利用SQL注入获取MYSQL数据库权限的要求: 文件读写基本要求: 是root用户最高权限 知道网站的绝对路径 文件读写注入的原理&#xff1a; 利用文件的读写权限进行注入&#xff0c;它可以写入一句话木马&#xff0c;也可以读取系统文件的敏感信息 文件读写…

Qt设计师中(没有现成的控件):如何添加QToolBar工具栏

1、在QtCreator设计师界面中,在MainWindow上右键,有“添加工具栏”菜单项 2、但只有在MainWindow上右键才有&#xff0c;在其它控件上方点击则没有&#xff0c;那么怎么在对话框上添加呢&#xff1f; 可以添加一个QWidget&#xff0c;然后手动在ui文件里把class改为QToolBar就…

canvas设置全局透明度globalAlpha(图文示例)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种&#xff0c;包括&#xff1a;示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示&#xff0c;有&#xff1a;急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…

环状热力图R语言画法

环状热力图&#xff08;Circular Heatmap&#xff09;是一种以环状布局展示数据的可视化方法。它结合了热力图和极坐标系统&#xff0c;能够有效地显示数据的关系、模式和趋势。 环状热力图通常用于可视化二维数据矩阵&#xff0c;其中行和列代表不同的类别或变量&#xff0c;…

K8S-NFS-StorageClass

工作流程 K8s中部署NFS-StorageClass K8s的StorageClass提供了为集群动态创建PV的能力。 1.部署NFS服务 2.选择NFS的Provinisoner驱动 K8S中没有内置的NFS的制备器&#xff0c;而定义StorageClass的时候需要指定制备器&#xff08;Pervisioner&#xff09;,所以需要&#xf…

OpenHarmony—开发及引用静态共享包(API 9)

HAR(Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C库、资源和配置文件。通过HAR可以实现多个模块或多个工程共享ArkUI组件、资源等相关代码。HAR不同于HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块的依赖项被引用。 接下来&a…

springboot146基于Spring Boot的可盈保险合同管理系统的设计与实现

可盈保险合同管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本可盈保险合同管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时…

富文本编辑器CKEditor4简单使用-02(常用插件安装及使用)

富文本编辑器CKEditor4简单使用-02&#xff08;常用插件安装及使用&#xff09; 1. CKEditor4 入门2. 下载并安装常用插件——Language插件2.1 下载插件2.2 下载并安装 Language 插件2.2.1 下载 Language 插件2.2.2 下载 Menu Button插件以及后续的各依赖插件2.2.3 安装下载的L…

YOLOv5改进 | Conv篇 | 结合Dual思想利用HetConv创新一种全新轻量化结构CSPHet(参数量下降20W,)

一、本文介绍 本文给大家带来的改进机制是我结合Dual的思想利用HetConv提出一种全新的结构CSPHet,我们将其用于替换我们的C3结构,可以将参数降低越20W,GFLOPs降低至4.1GFLOPs,同时本文的结构比我提出的另一个CSPPC精度更高,但是轻量化效果要差一点同时本文结构为我独家创…

ElasticSearch-IK分词器(elasticsearch插件)安装配置和ElasticSearch的Rest命令测试

四、IK分词器(elasticsearch插件) IK分词器&#xff1a;中文分词器 分词&#xff1a;即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库中或者索引库中的数据进行分词&#xff0c;然后进行一一个匹配操作&…

ElasticSearch概述及Window和Linux环境下安装

一、ElasticSearch 1、ElasticSearch概述 ES&#xff08;Elasticsearch&#xff09;是一个基于开放源代码的分布式搜索引擎&#xff0c;用于快速和灵活地搜索和分析大量数据。它是构建在Apache Lucene之上的&#xff0c;通过提供一个简单而强大的RESTful API来实现全文搜索、…

麒麟系统—— openKylin 安装 Nginx

麒麟系统—— openKylin 安装 Nginx 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载 nginx三、解压与运行解压检查与编译安装编译运行 四、配置加入到服务中加入环境变量nginx 配置文件 五、常用命令 Nginx 是一款高性能的 HTTP 和反向代理服务器&#xff0c…