0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RISC-V指令集

_light 来源:_light 作者:_light 2022-11-18 10:11 次阅读

1、寄存器

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

在这里插入图片描述

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

2、基础指令

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

在这里插入图片描述

每个字段名称的含义:


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

2.1、R 型指令

字段:

funct7 rs2 rs1 funct3 rd opcode
7位 5位 5位 3位 5位 7位

指令:

在这里插入图片描述

示例:

指令 示例 含义
add add a0, a1, a2 a0 = a1 + a2
sub sub a0, a1, a2 a0 = a1 - a2
sll sll a0, a1, a2 a0 = a1 << a2 (低位补0)
srl srl a0, a1, a2 a0 = a1 >> a2(高位补0)
sra sra a0, a1, a2 a0 = a1 >> a2 (算术右移,高位补原来的符号位)
slt slt a0, a1, a2 a1 < a2 ? 1 : 0
xor xor a0, a1, a2 a0 = a1 ^ a2
or or a0, a1, a2 a0 = a1
and and a0, a1, a2 a0 = a1 & a2

2.2、I 型指令

字段:

imm rs1 funct3 rd opcode
12位 5位 3位 5位 7位

指令:

在这里插入图片描述

示例:

指令 示例 含义
addi add a0, a1, 0x50
slli slli a0, a1, 5 a0 = a1 << 5 (低位补0)
srli srli a0, a1, 5 a0 = a1 >> 5 (高位补0)
srai sra a0, a1, 5 a0 = a1 >> 5 (高位补原来的高位)
slti slti a0, a1, 0x50 a1 < 0x50 ? 1 : 0
xori xor a0, a1, 0x50 a0 = a1 ^ 0x50
ori ori a0, a1, 0x50 a0 = a1
andi andi a0, a1, 0x50 a0 = a1 & 0x50

取值指令—Load

字段:

imm rs1 funct3 rd opcode
12位 5位 3位 5位 7位

指令:

在这里插入图片描述

示例:

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 型指令

字段:

imm[11:5] rs2 rs1 funct3 imm[4:0] opcode
7位 5位 5位 3位 5位 7位

指令:

在这里插入图片描述

示例:

sb  x10, 0(x1)  //x1的值加上0,将这个值作为地址, 将x10的值存储到上述地址所对应的内存中去 (只会将x10的值的低8位写入)
sh  x10, 0(x1)  //只会将x10的值的低16位写入
sw  x10, 0(x1)  //只会将x10的值的低32位写入

2.4、B 型指令

字段:

imm[12] imm[10:5] rs2 rs1 funct3 imm[4:1] imm[11] opcode
1位 6位 5位 5位 3位 4位 1位 7位

指令:

在这里插入图片描述

指令 示例 含义 备注
beq beq a1, a2, Lable if(a1 == a2){goto Label;} Lable是任意自定义的标签
bne bne a1, a2, Lable if(a1 != a2){goto Label;}
blt blt a1, a2, Lable if(a1 < a2){goto Label;}
bgt bgt a1, a2, 100 if(a1 > a2){goto Label;} 100与Label对应着相同的指令, 实际上在运行时Label会变成pc+xxx
bge bge a1, a2, 100 if(a1 <= a2){goto Label;}
ble ble a1, a2, 100 if(a1 >= a2){goto Lable;}

2.5、U 型指令

字段:

imm[31:12] rd opcode
10位 5位 7位

指令:

在这里插入图片描述

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

2.6、J 型指令

字段:

imm[20] imm[10:1] imm[11] imm[19:12] rd opcode
1位 10位 1位 8位 5位 7位

指令:

在这里插入图片描述

示例:

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、汇编语言翻译成机器语言

示例1:


例题

对于符号表示为:

add x9, x20, x21

的RISC-V指令,首先以十进制表示,然后用二进制表示

答案

有上面的介绍可知add指令的字段如下:

在这里插入图片描述

直接用十进制表示如下:

funct7 rs2 rs1 funct3 rd opcode
0 21 20 0 9 51

一条指令的每一段称为一个宇段。

第一、第四和第六个字段(0、0 和 51)组合起来告诉RISC-V计算机该指令执行加法操作。

第二个字段给出了作为加法运算的第二个源操作数的寄存器编号(21 表示 x21),

第三个字段给出了加法运算的另一个源操作数(20代表×20)。

第五个字段存放要接收总和的奇存器编号(9代表x9)。

因此,该指令将寄存器 x20 和寄存器 x21 相加并将和存放在寄存器x9中。

用二进制表示如下:

funct7 rs2 rs1 funct3 rd opcode
0000000 10101 10100 000 01001 0110011

总上,add x9, x20, x21 的RISC-V指令对应的机器码为: 00000001010110100000010010110011


示例2


例题

有以下几条汇编:

ld x9, 240(x10)
add x9, x21, x9
addi x9, x9, 1
sd x9, 240(x10)

将它们翻译为对应的机器码

答案

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5183

    浏览量

    118341
  • 指令集
    +关注

    关注

    0

    文章

    207

    浏览量

    23220
  • RISC-V
    +关注

    关注

    42

    文章

    2008

    浏览量

    45367
收藏 人收藏

    评论

    相关推荐

    正式的RISC-V基础指令集架构与特权架构规范来了,RISC-V基金会已正式批准

    根据RISC-V基金会官网发布的公告,RISC-V 基金会宣布了批准RISC-V 基础指令集架构与特权架构规范,为 RISC-V的可扩展性进
    的头像 发表于 07-11 10:46 9590次阅读

    浅谈RISC-V指令集架构的来龙去脉

    最近和几个行业内的朋友聊天,聊到了近两年比较火的AI人工智能,并向我推荐了一款目前在小范围内比较火的国产处理器,我查了一下该处理器是采用的开源RISC-V指令集架构。曾有人将RISC-V比作“半导体行业的Linux”,今天就和大
    的头像 发表于 01-24 17:42 6078次阅读

    Microchip发布业界首款基于RISC-V指令集架构的SoC FPGA开发工具包

    免费和开源的 RISC-V 指令集架构(ISA)的应用日益普遍,推动了经济、标准化开发平台的需求,该平台嵌入 RISC-V 技术并利用多样化 RISC-V 生态系统。
    发表于 09-17 12:56 1378次阅读

    有没有RISC-V指令集文档分享一下?

    有没有RISC-V指令集文档分享一下?了解一下他的汇编指令
    发表于 03-30 11:48

    RISC-V指令集说明哪里有?

    RISC-V指令集说明哪里有?汇编指令文档哪有?
    发表于 04-30 17:44

    仅用7个月就设计出了一款基于RISC-V指令集的AI芯片

    中国最早做RISC-V的公司选择了落户深圳,并且仅用7个月就设计出了一款基于RISC-V指令集的AI芯片,能耗和面积明显优于同级别Arm架构芯片,更让行业吃惊的是该款芯片一次性流片成功。这是否意味着
    发表于 08-02 11:59

    首款基于 RISC-V 指令集架构的 SoC FPGA 开发工具包

    Microchip 的 PolarFire SoC FPGA Icicle工具包为业界最低功耗的 FPGA 提供广泛的基于 RISC-V 指令集架构的 Mi-V 生态系统免费和开源的 RISC
    发表于 03-09 19:48

    RISC-V指令集架构

    发表于 11-03 08:50

    RISC-V指令集架构微控制器相关知识

    本系列痞子衡给大家介绍的是RISC-V指令集架构微控制器相关知识。  RISC-V指令集最早要追溯到2010年,是加州大学伯克利分校的一个研究团队的项目,目标是设计一种新的
    发表于 12-16 06:24

    三星正在计划采用开源RISC-V指令集来打造自己的5G基带芯片

    在近日举行的年度 RISC-V 峰会上,三星表示,经过 2 年多的测试验证,决定采用开源 RISC-V 指令集,来打造自己的 5G 基带专用芯片。 据悉,该芯片将用于 2020 年到期的三星旗舰 5G 智能手机。
    发表于 02-22 09:37 834次阅读

    基于RISC-V指令集Egret系列处理器的性能及应用场景

    risc-v峰会上由厦门半导体投资集团有限公司的王旭给我们介绍了基于RISC-V指令集的Egret系列处理器,分别从特性、应用场景、优势等几个方面对这个系列的处理器进行了详细的展现。
    发表于 06-22 15:36 2104次阅读
    基于<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>Egret系列处理器的性能及应用场景

    risc-v中国峰会直播:如何优化RISC-V指令集架构的代码密度?

    第一届中国峰会在上海举办,以下是小编整理的部分risc-v峰会的内容。主要介绍了影响代码密度的因素以及如何优化RISC-V指令集架构的代码密度?感兴趣的小伙伴可以详细了解一下。
    的头像 发表于 06-23 12:12 2883次阅读
    <b class='flag-5'>risc-v</b>中国峰会直播:如何优化<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>架构的代码密度?

    RT-Thread全球技术大会:RISC-V指令集开源软件生态介绍

    RT-Thread全球技术大会:RISC-V指令集开源软件生态介绍
    的头像 发表于 05-27 09:47 1002次阅读
    RT-Thread全球技术大会:<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>开源软件生态介绍

    简单讲讲RISC-V指令集CPU的参数

    本次CPU采用32位RISC-V指令集架构(一代是自己瞎编指令集)。指令集就是程序指令的集合,指引硬件如何设计、如何运行。
    的头像 发表于 08-07 14:55 3103次阅读
    简单讲讲<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>CPU的参数

    瑞萨推出首款基于RISC-V指令集架构的处理器内核

    嵌入式硬件专家瑞萨电子宣布推出首款基于免费开放的 RISC-V 指令集架构 (ISA) 的完全自主研发的处理器内核。
    的头像 发表于 12-01 17:28 1055次阅读
    瑞萨推出首款基于<b class='flag-5'>RISC-V</b><b class='flag-5'>指令集</b>架构的处理器内核