RISC-V 指令系统

指令系统

指令集

指令集从本质上可以分为复杂指令集(Complex Instruction Set Computing,CISC)和精简指令集(Reduced Instruction Set Computing,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。

指令架构(Instruction Set Architecture, 缩写为ISA),是软件和硬件的接口,不同的应用需求,会有不同的指令架构。

RISC-V指令集使用模块化的方式进行组织,每一个模块使用一个英文字母来表示。最基本也是唯一强制要求实现的指令集部分是I字母代表的基本整数指令集。

RISC-V指令格式

常见的RISC-V指令集如下表所示

基本指令集含义
RV32I32位整数指令集
RV32ERV32I的子集,用于小型嵌入式场景
RV64I64位整数指令集,兼容RV32I
RV128I128位整数指令集,兼容RV64I和RV32I

RISC-V有六种基本指令格式:

指令类型操作
R-type用于寄存器-寄存器操作
I-type用于短立即数和访存 load 操作
S-type用于访存 store 操作
B-type用于条件跳转操作
U-type用于长立即数
J-type用于无条件跳转

在RISC-V中对于所有指令,要读写的寄存器的标识符总是在同一位置,意味着在解码指令之前,就可以先开始访问寄存器,这些格式的立即数字段总是符号扩展,符号位总是在指令中最高位,各种类型的指令构成如下图所示:

在这里插入图片描述

字段含义
opcode(操作码)指令的基本操作,这个缩写是它惯用名称
rd目的操作寄存器,用来存放操作结果
funct3一个另外的操作码字段
rs1第一个源操作数寄存器
rs2第二个源操作数寄存器
funct7一个另外的操作码字段
imm立即数

R型指令

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

I型指令

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位无符号数值

S型指令

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位写入

B型指令

B型指令构成如下:

在这里插入图片描述

(注:imm[0]被丢弃,因为它始终为零)

///-----------------------------------------------------------------------------------------------------------

指令体系架构说明,cpu在计算目标分支地址时,将偏移量左移一位表示半字为单位的偏移量,这样偏移量的有效范围就扩大到两倍。

编译器已经提前处理好数据,也就是左移一位,cpu再左移一位刚好对齐。

bne x9 x0 0
0000000,00000,01001,001,0000,0,1100011
imm[4:1]=0000

bne指令会比较 x9 x0 的值。

如果不相等,程序将跳转到 PC + 0,即下一条指令。

bne x9, x0, 0 的行为:

  • 假设指令 bne 的地址是 PC,偏移量为 0,意味着目标地址就是 PC
  • 程序实际上会跳转到当前指令的下一条指令地址,因为 PC 在指令执行完后自动更新。
bne x9 x0 4
0,000000,00000,01001,001,0010,0,1100011
imm[4:1]=0010
bne x9 x0 8
0000000,00000,01001,001,0100,0,1100011
imm[4:1]=0100

///-----------------------------------------------------------------------------------------------------------

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;}

U型指令

U型指令构成如下:

在这里插入图片描述

U型的全部指令(RV32I)

在这里插入图片描述

示例“”
lui  x10, 0x65432 //得到立即数的高20位,低位补0,立即数范围为:0x00~0xFFFFF

J型指令

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

通用寄存器

RV32I有32个通用寄存器,以及一个PC寄存器。其中有一个通过硬件设置的值恒为 0 的 x0 寄存器

注:RISC-V的32个寄存器x0~x31是用0~31这些数字来表示。

参考资料:
RISC-V 指令集介绍

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

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

相关文章

贪心算法合集一

1005.K次取反后最大化的数组和 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后…

如何理解数据模型?颗粒度、维度及指标?

问题1 什么是数据模型&#xff1f; 数据模型反映在数据库中就是一张表&#xff0c;该表把他分开来看有以下关注的点。 &#xff08;1&#xff09;主键&#xff1a;表明该表主要的分析对象&#xff0c;比如我们的分析对象是订单、是商品、是门店&#xff0c;那么主键就是订单id,…

Qt 线程 QThread类详解

Qt 线程中QThread的使用 在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c; 如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个…

你所不知道的关于AI的27个冷知识——算法的作用

算法的作用 亲爱的朋友们,今天我们要探讨的是一个关于“魔法配方”的故事,也就是AI世界里的算法。这些算法就像是古老的魔法咒语,让AI能够在我们生活中的各个角落施展奇迹。让我们一起来揭开这些神奇算法的面纱,看看它们是如何在幕后默默工作的。 什么是算法? 首先,让…

昇思MindSpore学习笔记6-02计算机视觉--ResNet50迁移学习

摘要&#xff1a; 记录MindSpore AI框架使用ResNet50迁移学习方法对ImageNet狼狗图片分类的过程、步骤。包括环境准备、下载数据集、数据集加载、构建模型、固定特征训练、训练评估和模型预测等。 一、概念 迁移学习的方法 在大数据集上训练得到预训练模型 初始化网络权重参数…

【机器学习】特征选择:精炼数据,提升模型效能

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 特征选择&#xff1a;精炼数据&#xff0c;提升模型效能引言为何进行特征选择&a…

Android面试题汇总-框架技术

一、OkHttp OkHttp是一个流行的HTTP客户端库&#xff0c;用于发送和接收HTTP网络请求。以下是OkHttp的关键特性和工作原理的概述&#xff1a; 执行请求: execute() 方法: 同步执行HTTP请求&#xff0c;返回Response对象。enqueue() 方法: 异步执行HTTP请求&#xff0c;通过Ca…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…

云原生存储:使用MinIO与Spring整合

在现代云原生应用开发中&#xff0c;高效、可靠的存储解决方案是至关重要的。MinIO是一个高性能、分布式的对象存储系统&#xff0c;它与Amazon S3兼容&#xff0c;非常适合在Kubernetes等云原生环境中使用。本文将详细介绍如何在Spring Boot应用中整合MinIO&#xff0c;并提供…

接口调用的三种方式

例子&#xff1a; curl --location http://110.0.0.1:1024 \ --header Content-Type: application/json \ --data {"task_id": 1 }方式一&#xff1a;postman可视化图形调用 方式二&#xff1a;Vscode中powershell发送请求 #powershell (psh) Invoke-WebRequest -U…

熟悉Realsense和机械臂的控制库(如MoveIt!)的使用,以及基本的PID控制和其他控制算法

项目1&#xff1a;基础Realsense数据采集与处理 目标&#xff1a;了解Realsense摄像头的基本使用&#xff0c;数据采集和处理。 步骤&#xff1a; 安装并配置Realsense SDK。使用Realsense摄像头采集深度图像和RGB图像。实现基本的图像处理操作&#xff0c;如边缘检测、物体识…

温州海经区管委会主任、乐清市委书记徐建兵带队莅临麒麟信安调研

7月8日上午&#xff0c;温州海经区管委会主任、乐清市委书记徐建兵&#xff0c;乐清市委常委、副市长叶序锋&#xff0c;乐清市委办主任郑志坚一行莅临麒麟信安调研&#xff0c;乐清市投资促进服务中心及湖南省浙江总商会相关人员陪同参加。麒麟信安董事长杨涛、总裁刘文清热情…

超图Environment.initialization报空指针

如果库没倒错&#xff0c;许可证也在&#xff0c;一般是权限问题&#xff0c;要确保以下三个读写权限都在&#xff0c;制定版本要动态申请&#xff0c;官方Demo的代码里动态申请权限少一个。 /*** 需要申请的权限数组*/protected String[] needPermissions {Manifest.permiss…

Linux - VIM 全面教程

Linux - VIM 全面教程 前言 VIM 是一个强大的文本编辑器&#xff0c;被广泛用于 Linux 系统上。对于许多程序员和系统管理员来说&#xff0c;熟练掌握 VIM 是一项非常重要的技能。本教程将全面介绍 VIM 的基础知识和高级功能&#xff0c;帮助你更好地利用这一工具。 目录 安…

elasticsearch集群模式部署

系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) es版本&#xff1a; elasticsearch-7.6.2 本次搭建es集群为三个节点 添加启动用户 添加之前用户要是创建好了的(这里的es用户并不是绝对要求&#xff0c;你可以根据具体的需要命名创建) visudo 修改配置文件 sys…

【吊打面试官系列-MyBatis面试题】使用 MyBatis 的 mapper 接口调用时有哪些要求?

大家好&#xff0c;我是锋哥。今天分享关于 【使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用 MyBatis 的 mapper 接口调用时有哪些要求&#xff1f; 1、Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的…

数据结构(初阶1)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

Sharding-JDBC分库分表之SpringBoot分片策略

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 前言 前一篇以一个示例分享了Sharding-JDBC的基本使用。在进行分库分表时&#xff0c;可以设置分库分表的分片策略&#xff0c;在示例中&#xff0c;使用的是最简单的…

面对数据不一致性的解决方案:

polarDB是读写分离和计算存储分离的分布式数据库&#xff0c;并且副本的log replicate是基于Parallel-Raft协议来实现的。所以在瞬时进行写和读的操作时&#xff0c;是不可避免会存在数据一致性问题&#xff0c;导致这个数据一致性问题的原因不是事务&#xff0c;而是多副本日志…

springboot篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …