RISC-V 指令集介绍

news2024/12/23 18:22:26

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指令集如下表所示:

基本指令集含义
RV32I32位整数指令集
RV32E

RV32I的子集,用于小型嵌入式场景

RV64I64位整数指令集,兼容RV32I
RV128I128位整数指令集,兼容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博客

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

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

相关文章

1400*A. Factory

Examples input 1 5 output No input 3 6 output Yes 题意&#xff1a; a 和 m&#xff0c;a 不断加 a%m &#xff0c;如果 a 有一次能够被 m 整除&#xff0c;则打印 Yes&#xff0c;如果一直循环永远不可能被 m 整除&#xff0c;则打印 No 解析&#xff1a; 可以观…

BUU CODE REVIEW 1

BUU CODE REVIEW 1 考点&#xff1a;PHP变量引用 源码直接给了 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->c…

数据库中RIGHT_TYPE=3和RIGHT_TYPE=“3“的区别

G_USERINFO表归档条件SQL错误&#xff0c; RIGHT_RIGHT_TYPE3应改为RIGHT_TYPE"3"&#xff0c; 该字段为字符类型 在Oracle中&#xff0c;类型&#xff08;type&#xff09;通常是指数据库中的表、视图、索引、存储过程、函数等对象的的数据类型或结构。在比较类型&a…

解决:h5的<video>在移动端浏览器无法自动播放

并不是所有的移动端浏览器都无法自动播放&#xff0c;下载谷歌、火狐、edge等都可以正常播放&#xff0c;目前发现夸克浏览器无法自动播放。即autoplay属性失效。 <video autoplay"autoplay"></video> 可能移动端有移动端的策略&#xff0c;但解决夸克…

C++标识符的作用域与可见性

标识符是一个由程序员定义的名称&#xff0c;为标识区别变量、函数和数据类型等&#xff0c;代表程序的某些元素&#xff0c;变量名就是标识符的一个展现。 作用域讨论的是标识符的有效范围&#xff0c;可见性讨论的是标识符是否可以被引用。在一个函数中声明的变量就只能在这个…

vue中使用代码编辑器 vue2-ace-editor

npm install --save-dev vue2-ace-editor// 全局引入 main.jsimport Editor from vue2-ace-editor; Vue.use(Editor)//组件中引入import Editor from vue2-ace-editor; components: {Editor, },<template><div class"codeEditBox"><editorv-model&qu…

2353. 设计食物评分系统;1895. 最大的幻方;842. 将数组拆分成斐波那契序列

2353. 设计食物评分系统 核心思想&#xff1a;首先明确我们有哪些功能&#xff0c;首先是修改某种食物分数的功能&#xff0c;然后第二点是能够每次弹出分数高字典序小的食物名字。由这两个我们想到了a 食物[分数],b 烹饪方式[分数&#xff0c;食物名字] 然后有一点经验的感…

小程序基础笔记

一、小程序与普通网页开发的区别 1、运行环境不同 网页运行在浏览器环境中小程序运行在微信环境中 2、API 不同 由于运行环境的不同&#xff0c;所以小程序中&#xff0c;无法调用 DOM 和 BOM 的 API。但是&#xff0c;小程序中可以调用微信环境提供的各种 API&#xff0c;例如…

初识低代码开发平台

2019年开始&#xff0c;低代码爆火&#xff0c;有人唱衰有人捧&#xff0c;反对的人认为对于那些真正的程序员来说&#xff0c;简直就是毒瘤&#xff0c;只是炒作概念而已&#xff0c;等尘埃落地&#xff0c;肯定一地鸡毛。 但是对于那些缺技术、缺人才&#xff0c;又需要数字…

ERROR:No tf data. Actual error: Fixed Frame [map] does not exist 解决办法

问题场景&#xff1a; 使用rviz时&#xff0c;出现warning&#xff0c;并且地图无法加载&#xff0c;如下所示&#xff1a; 原因分析&#xff1a; 之所以地图无法加载出来&#xff0c;其主要原因是tf树中没有world坐标系&#xff0c;解决方法就是让rviz知道world坐标系在哪…

短视频平台视频怎么去掉水印?

短视频怎么去水印&#xff0c;困扰很多人&#xff0c;例如&#xff0c;有些logo水印&#xff0c;动态水印等等&#xff0c;分享操作经验&#xff1a; 抖音作为中国最受欢迎的社交娱乐应用程序之一&#xff0c;已成为许多人日常生活中不可或缺的一部分。在使用抖音过程中&#x…

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播&#xff08;Multicast&#xff09;方式的数据传输是基于 UDP 完成的。因此 &#xff0c;与 UDP 服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP 数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入&#xff08;注…

【奥比中光Gemini 2L快速上门】

奥比中光Gemini 2L快速上手 目录 奥比中光Gemini 2L快速上手[TOC](目录) 一、下载配置环境1.1 官网下载SDK1.2 配置环境 二、测试2.1 在bin中运行示例2.2 配置cmake 三、CMAKE3.1 CmakeLists.txt中各设置的意义 一、下载配置环境 1.1 官网下载SDK 进入官网&#xff0c;下载名…

maven的下载安装与配置环境变量!!!(全网最详细)

1.maven 官方网站&#xff0c;http://maven.apache.org 2.去官网下载。 3.选择你自己的解压路径&#xff08;D:\maven【我的挤压路径】&#xff09; 4.配置jdk环境变量&#xff08;不会的小伙伴可以看我以前的博客&#xff09; jdk 1.8 安装配置环境变量_明天更新的博客-CSD…

详细介绍Webpack5中的Plugin

Plugin的作用 插件Plugin可以扩展webpack&#xff0c;加入自定义的构建行为&#xff0c;使 webpack 可以执行更广泛的任务&#xff0c;拥有更强的构建能力。 Plugin的工作原理 webpack就像一条生产线&#xff0c;要经过一系列处理流程后才能将源文件转换成输出结果。 这条生…

Linux系统下MySQL读写分离

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、基于Amoeba读写分离 1.基于程序代码内部实现 2.基于中间代理层实现 三、操作步骤 1.在主机Amoeba上安装java环境 2.安装并配置Amoeba 3.配置Amoeba读写分离…

matlab RRR机械臂 简略代码

RRR机器人&#xff01;启动&#xff01; gazebo在arm mac上似乎难以运行&#xff0c;退而选择Matlab&#xff0c;完成老师第一个作业&#xff0c;现学现卖&#xff0c;权当记录作业过程&#xff0c;有不足之处&#xff0c;多多指教。 作业&#xff01;启动&#xff01; RRR机…

WAF绕过-信息收集篇

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

有效的随机圆检测

文章目录 0、 摘要&#xff1a;一、 Base Idea二、 Determining Possible Circle2.1 判别条件2.2 圆的判别 三、Determining True Circles四、The Proposed RCD五、改进六、参考在这里插入图片描述 有效的随机圆检测 0、 摘要&#xff1a; 参考的文章提出了一种有效的不基于霍…

一文教你搭建工程化开发环境!

搭建工程化开发环境 下载 Node.js 官方下载地址 https://nodejs.org/zh-cn/download/releases node.js 版本迭代的非常快&#xff0c;目前官方已经推出到 v19.2.0 版本了&#xff0c;相对是一个比较新的版本了。建议下载 v14.18.3 版本&#xff0c;至少这个版本目前在很多项…