RISC-V 指令系统

news2024/9/24 23:23:49

指令系统

指令集

指令集从本质上可以分为复杂指令集(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.coloradmin.cn/o/1910221.html

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

相关文章

TAGE predictor

参考文档&#xff1a;分支预测算法&#xff08;一&#xff09;&#xff1a;TAGE|SunnyChen的小窝 TAGE的基础概念 TAGE是现今最经典的分支预测算法&#xff0c;TAGE及其后续的变体都是当今高性能微处理器的分支预测算法基础。因此&#xff0c;要聊分支预测算法的话题必定绕不开…

【算法】(C语言):快速排序(递归)、归并排序(递归)、希尔排序

快速排序&#xff08;递归&#xff09; 左指针指向第一个数据&#xff0c;右指针指向最后一个数据。取第一个数据作为中间值。右指针指向的数据 循环与中间值比对&#xff0c;若大于中间值&#xff0c;右指针往左移动一位&#xff0c;若小于中间值&#xff0c;右指针停住。右…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议&#xff08;ICBAIE 2024&#xff09;定于2024年10月25-27号在中国深圳隆重举行。…

新功能上线 | 自定义工作台,成就个性化办公

为进一步优化用户操作体验&#xff0c;帮助用户更轻松、便捷的使用采购系统&#xff0c;隆道平台面向用户推出自定义工作台。根据个人的工作习惯和需求&#xff0c;轻松定制专属的工作界面。无论您需要快速查看待办事项&#xff0c;还是实时追踪业务进度&#xff0c;或是全面掌…

掌握这五大关键,轻松驾驭AI大模型项目落地

随着AI技术的蓬勃发展&#xff0c;众多企业纷纷投身于大模型项目的浪潮中&#xff0c;力求在这场技术革新中占据一席之地。然而&#xff0c;成功与失败并存&#xff0c;背后的原因引人深思。本文将为您揭示五大关键因素&#xff0c;助您轻松驾驭AI大模型项目的落地过程。 一、…

FL Studio 24.1.1.4234 Crack

Image-Line bvba 的 FL Studio 是一款数字音频工作站&#xff08;DAW&#xff09;软件&#xff0c;是音乐家、制作人和音频工程师的完整音乐制作解决方案。FL Studio 以其直观的界面、强大的功能和广泛的性能而著称&#xff0c;用户可以利用它高效、创造性地进行作曲、编曲、录…

动手学深度学习53 语言模型

动手学深度学习53 语言模型 语言模型代码QA 语言模型 核心&#xff1a;预测文本出现的概率 最常见应用&#xff1a;做预训练模型 当数据序列很长怎么办&#xff1f;常用n-gram 。 一元语法&#xff1a;马尔科夫假设tao0 基本认为每一个字是独立的&#xff0c;不管前面的东西。…

zabbix“专家坐诊”第245期问答

问题一 Q&#xff1a;vfs.dev.discovery拿的是哪里的文件&#xff0c;我看源码里面获取的是/proc/parttions里面的信息&#xff0c;但是我没有这个device&#xff0c;是怎么获取出来的&#xff1f; 在这里插入图片描述 A&#xff1a;检查下系统内核版本或者agent程序版本&…

收银系统源码

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 私有化独立部署/全开源源码&#xff0c;系统开发语言&#xff1a; 核心开发语言: PHP、HTML…

数据结构(初阶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; …

区间贪心

目录 1.贪心算法的思想 2.区间贪心算法常用的一些题目类型 1.选择最多不相交区间问题 P2970 [USACO09DEC] Selfish Grazing S 1.思路分析 2.上代码 2.区间选点问题 P1250 种树 1.题目 2.方法一 1.代码解释 3.方法二 3.区间合并问题 P2434 [SDOI2005] 区间 1. 思路…

容器docker

文章目录 前言一、docker1.1 为什么有docker1.2 docker架构1.3 docker 安装1.4 docker中央仓库1.5 docker 基本指令1.6 docker数据卷&#xff0c;挂载例&#xff1a;nginx 数据卷挂载例&#xff1a;mysql 本地持久化 1.7 镜像制作镜像结构dockerfile基础指令容器生成镜像 1.8 d…

JFlash读取和烧录加密stm32程序

JFlash读取和烧录加密stm32程序 安装后JFlash所在的目录&#xff1a;C:\Program Files\SEGGER\JLink 一、烧写加密程序 1、打开C:\Program Files\SEGGER\JLink目录&#xff0c;找到JFlash.exe,双击它&#xff0c;就可以打开该执行程序。见下图&#xff1a; 2、选择“Create …

Vue基础知识:Vue3.3出现的defineOptions,如何使用,解决了什么问题?

1.那么为什么会出现defineOptions? 原因说明&#xff1a; 有<script setup></script>语法糖应用之前&#xff0c;如果要定义 props&#xff0c;emits 可以轻而易举地添加一个与 setup 平级的属性。但是用了<script setup>后&#xff0c;就没法这么干了整个…

地理服务零成本:免费地图API合辑

在全球化和数字化不断推进的今天&#xff0c;地图已成为我们日常生活和工作中不可或缺的工具。无论是规划日常通勤、探索未知地域&#xff0c;还是进行地理数据分析&#xff0c;地图都发挥着至关重要的作用。它们不仅提供了地理信息的直观表示&#xff0c;还支持复杂的空间查询…

【U8+】登录U8时,选择账套登录窗口闪退。

【问题描述】 打开用友U8企业应用平台登录窗口&#xff0c; 输入账号和密码后&#xff0c;选择账套的时候闪退。 【解决方法】 方法一&#xff1a; 重装微软的silverlight&#xff0c;在U8soft\3rdprogram中有安装包。 注&#xff1a;不要自动更新此程序版本。关闭杀毒软件防火…

【线程安全】线程互斥的原理

文章目录 Linux线程互斥线程互斥相关概念互斥量mutex引出线程并发问题引出互斥锁、互斥量 互斥量的接口初始化互斥量销毁互斥量互斥量加锁和解锁使用互斥锁抢票 可重入和线程安全概念&#xff1a;常见线程不安全的情况常见线程安全的情况常见不可重入的情况常见可重入情况可重入…

jvm 05JVM - 对象的创建 ,oop模型,字符串常量池

01.JVM - 对象的创建 1、对象的创建的方式 Java语言中&#xff0c;对象创建的方式有六种&#xff1a; new关键字&#xff1a;最常见的形式、Xxx的静态方法、XxxBuilder、XxxFactory的静态方法。 Class类的newInstance()方法&#xff1a;通过反射的方式创建对象&#xff0c;调…

92. 反转链表 II (Swift 版本)

题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 分析 这是一个经典的链表问题&#xff0c;要求反转链表的部分节点。我们可以通过以下步骤实…