2024年最全计算机系统基础(五)之RISC-V指令集_risc指令集,【大牛系列教学】

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • rs1 (Source Register #1)是第一个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。
  • 存放12位的立即数——imm[11:0],在指令格式的20-31bit位上。

I类型指令可以用于:

  • 寄存器-立即数的运算
  • 加载指令

格式上只有一个字段不同于r格式,rs2和funct7替换为12位符号立即数(immediate字)imm[11:0]。immediate字段为补码值,所以它可以表示从-2"到2"-1之间的整数。当I型格式用于加载指令时,immediate字段表示一个字节偏移量,所以加载双字指令可以取相对于基址寄存器rd中基地址偏移±(2"或2048)字节(±(2或256)个双字)的任何双字。

指令格式展示:
寄存器-立即数的运算
在这里插入图片描述
加载指令
同样格式的I类型指令也可以用作加载指令
在这里插入图片描述
在这里插入图片描述

I类型的指令算术展示:
画圈表示位移方向0表示向左移,1表示向右移
注:其中画圈表示位移方向0表示向左移,1表示向右移

  • SLLI:是逻辑左移,低位补零
  • SRLI:是逻辑右移, 高位补零
  • SRAI:是算术右移,高位补原来高位。
    在这里插入图片描述
    注:RV32I 支持加载有符号和无符号字节和半字(lb,lbu,lh,lhu)

举例:

addi x15,x1,-50

在这里插入图片描述
加载:

lw x14, 8(x2)

在这里插入图片描述

3.1.3 S类型指令

S类型指令将32位划分成6个区域:

  • opcode是操作码,占了7bit,在指令格式的0-6bit位上
  • imm[4:0]+imm[11:5]:立即数分成两个:存放前5位的立即数——imm[4:0],在指令格式的7-11bit位上;存放后7位立即数——imm[11:5],在指令格式的25-31bit位上。
  • funct3是操作字段。funct3占了3bit,在指令格式的12-14bit位上。
  • rs1 (Source Register #1)是第一个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。
  • rs2 (Source Register #2)是第二个源操作数寄存器,占了5bit,在指令格式的25-31bit位上。

S型格式的12位 immediate字段分成了两个字段,低5位和高7位。RISC-V体系结构设计师选择这种设计是因为它能够在所有指令格式中保持rs1和 rs2字段在相同的位置。保持尽可能相似的指令格式降低了硬件的复杂性。同样,opcode和 funct3字段也总是保持同样的大小并在同一个位置。

指令格式展示:
在这里插入图片描述
S类型的指令算术展示:
在这里插入图片描述
注:sb = Store byte,sh = Store halfword, sw = Store word
举例

sw x14, 8(x2)  #先将x2寄存器偏移8bit,再存到x14寄存器。

在这里插入图片描述

3.1.4 B类型指令

B类型指令将32位划分成6个区域:

  • opcode是操作码,占了7bit,在指令格式的0-6bit位上
  • imm[4:1]+imm[11]+imm[10:5]+imm[12]:立即数分成四个:
    • 存放第11位的立即数——imm[11],在指令格式的第7bit位上;
    • 存放第1位到第5位的立即数——imm[4:1],在指令格式的8-11bit位上;
    • 存放后6位的立即数——imm[11:5],在指令格式的25-30bit位上;
    • 存放第12位的立即数——imm[12],在指令格式的31bit位上。
      注:imm[0]被丢弃,因为它始终为零。
  • funct3是操作字段。funct3占了3bit,在指令格式的12-14bit位上。
  • rs1 (Source Register #1)是第一个源操作数寄存器,占了5bit,在指令格式的15-19bit位上。
  • rs2 (Source Register #2)是第二个源操作数寄存器,占了5bit,在指令格式的25-31bit位上。

B类型指令属于有条件的分支。RV32I 可以比较两个寄存器并根据比较结果上进行分支跳转。比较可以是:相等(beq),不相等 (bne),大于等于(bge),或小于(blt)。最后两种比较有符号比较,RV32I 也提供相应的无符号版本比较的:bgeu 和 bltu。剩下的两个比较关系(大于和小于等于)可以通过简单地交换两个操作数,即可完成比较。因为 x < y 表示 y > x 且 x ≥ y表示 y ≤ x。
在这里插入图片描述
RISC-V汇编语言包含两个决策类指令,类似于带go to的if语句。

  • 第一条指令是:
beq rs1, rs2, Ll

该指令表示如果寄存器rs1中的值等于寄存器rs2中的值,则转到标签为L1的语句执行。助记符beq代表相等则分支。

  • 第二条指令是:
bne rs1, rs2, Ll

该指令表示如果寄存器rs1中的值不等于寄存器rs2中的值,则转到标签为L1的语句执行。助记符bne代表不等则分支。

这两条指令通常称作条件分支指令。

注:PC 相对寻址在后续补充
在这里插入图片描述
举例

beq x19,x10, offset = 16 bytes

在这里插入图片描述

3.1.5 U类型指令

U类型指令将32位划分成3个区域:

  • opcode是操作码,占了7bit,在指令格式的0-6bit位上
  • rd (Destination Register)是目的寄存器,占了5bit,在指令格式的7-11bit位上
  • imm[31:12]:存放高20位的立即数——imm[31:12],在指令格式的12-31bit位上
    在这里插入图片描述

U类型指令包含两种指令

  • LUI – 加载高位立即数
  • AUIPC – 立即数地址添加到PC寄存器中

在这里插入图片描述
之前的类型指令中,已经有了12位的立即数作为表示常量。虽然常量通常很短并且适合12位,但有时它们也会更大。RISC-V指令系统包括指令 load upper immediate(取立即数高位,lui),用于将高20位常数加载到寄存器的第31位到第12位。将寄存器的低12位用0填充。该指令会与ADDI指令一起使用,目的是将低12位写入目标寄存器,以实现对32位的寄存器数值设置。
LUI x10 0x87654 # x10 = 0x87654000
ADDI x10,x10,0x321 # x10 = 0x87654321

:由于ADDI的12位立即数最高位是符号位。例如:

如何利用LUI加载0xDEADBEEF

LUI x10, 0xDEADB     # x10 = 0xDEADB000
ADDI x10, x10, 0xEEF    # x10 = 0xDEADAEEF

由上可知 0xDEADAEEF不等于0xDEADBEEF
所以当ADDI 的12位立即数为负,也就是最高位bit位为1时,得到而结果是高20为减1再和低12位拼接起来。(减1是和补码有关)

解决方法:当数值的低12位的符号为1时,将利用lui装入的高20为的立即数值预先加1,而ADDI写入的低12位不变。如下

LUI x10, 0xDEADB # x10 = 0xDEADB000
ADDI x10, x10, 0xEEF # x10 = 0xDEADAEEF

在汇编语言中还可以使用li伪指令,直接装入32位的数值,但时它在编译时还是会编译成LUI和ADDI这两条指令。

li x10, 0xDEADBEEF 

AUIPC指令加载一个20bit的的立即数,取值范围为0-1048575,但是该指令rd中保存的数据是(pc)+(立即数<<12)。用于PC相对寻址。

Label:  AUIPC x10, 0    # Puts address of label in x10

3.1.6 J类型指令

J类型指令将32位划分成3个区域:

  • opcode是操作码,占了7bit,在指令格式的0-6bit位上
  • rd (Destination Register)是目的寄存器,占了5bit,在指令格式的7-11bit位上
  • imm[19:12]+imm[11]+imm[10:1]+imm[20]:
    • 存放第1位到第10位的立即数——imm[10:1],在指令格式的21-30bit位上;
    • 存放11位的立即数——imm[11],在指令格式的20bit位上;
    • 存放第12位到第19位的立即数——imm[19:12],在指令格式的12-19bit位上;
    • 存放第20位的立即数——imm[20],在指令格式的31bit位上;

在这里插入图片描述
跳转并链接指令(jal)具有双重功能。若将下一条指令 PC + 4 的地址保存到目标寄存器中,通常是返回地址寄存器 ra(见下图 寄存器),便可以用它来实现过程调用。像分支一样,jal 将其 20 位分支地址乘以 2,进行符号扩展后再添加到 PC 上,便得到了跳转地址。
在这里插入图片描述

注: 如果使用零寄存器(x0)替换 ra 作为目标寄存器,则可以实现无条件跳转,因为 x0 不能更改。

跳转和链接指令的寄存器版本(jalr)同样是多用途的。它可以调用地址是动态计算出来的函数,或者也可以实现调用返回(只需 ra 作为源寄存器,零寄存器(x0)作为目的寄存器)。Switch 和 case 语句的地址跳转,也可以使用 jalr 指令,目的寄存器设为 x0。

3.2 RV32I 寄存器

RV32I有32个通用寄存器,以及一个PC寄存器。其中有一个通过硬件设置的值恒为 0 的 x0 寄存器,
在这里插入图片描述

3.3 RISC-V的寻址方式

RISC-V分支指令寻址,在之前的B类型指令就是其中之一。
这种格式可以表示从-4096到4094的分支地址,以2的倍数表示。B型格式包括一个7位操作码、一个3位功能码、两个5位的寄存器操作数( rs1和 rs2)和一个12位地址立即数。该地址使用特殊的编码方式,简化了数据通路设计,但使组装变得复杂。下面这条指令

bne x10,x11,2000    // if x10 != xll,go to location 2000  = 0111 1101 0000

在这里插入图片描述
其中条件分支的操作码是11001112,而bne 的funct3码是0012
RISC-V的无条件跳转–链接指令(jal),是分支寻址的另一种方法,也是唯一使用J型格式的指令。该指令由一个7位操作码、一个5位目标寄存器操作数(rd)和一个20位地址立即数组成。链接地址,即jal之后的指令的地址,被写入rd 中。

如果程序的地址必须适合这个20位字段,则意味着没有程序可能大于220,所以另一种方法是指定一个与分支地址偏移量相加的寄存器,这样就允许程序大到264,并且仍然能够使用条件分支指令,以便分支指令可以按如下来计算:

程序计数器=寄存器内容+分支地址偏移量
这样就允许程序大到2^64,并且仍然能够使用条件分支指令

在这里插入图片描述

  1. 立即数寻址,操作数是指令本身的常量。
  2. 寄存器寻址,操作数在寄存器中。
  3. 基址或偏移寻址,操作数于内存中,其地址是寄存器和指令中的常量之和。

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

[外链图片转存中…(img-Nl6B52jY-1715637926951)]
[外链图片转存中…(img-7wEYul7m-1715637926952)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RISC-V(Rez Instruction Set Computer – Five)是一种开源的指令集架构(ISA),由加州大学伯克利分校的研究团队开发。RISC-V的设计理念是简化指令集和硬件结构,以提高处理器性能和效能。 RISC-V采用了精简的指令集,包括基本的数据传输、算术、逻辑和分支指令,这些指令可以完成基本的计算任务。相比较传统的复杂指令计算机(CISC),RISC-V有更少的指令类型,并且指令长度固定,这有助于简化处理器设计和优化执行效率。 RISC-V指令集的特点之一是可扩展性。通过引入标准的扩展指令集,开发者可以根据应用的需求扩展RISC-V指令集来支持不同的功能,如浮点运算、向量运算等。这种灵活性使得RISC-V适用于各种不同的应用领域,从嵌入式系统到高性能计算,都可以使用RISC-V进行开发。 另一个重要的特点是RISC-V是一个开源的指令集架构。这意味着任何人都可以免费获取RISC-V的技术文档和相关工具,并将其用于自己的项目中。这种开放性推动了RISC-V的广泛应用和发展,并吸引了球范围内的学术界、工业界和研究机构的关注和参与。 总的来说,RISC-V指令集是一种简化、灵活和开源的指令集架构,具有高性能和高效能的特点。它的简洁设计和扩展性使得它适用于各种应用领域,并受到球范围内广泛的关注和采用。 ### 回答2: RISC-V是一种开放、免费的指令集架构,它是由加州大学伯克利分校开发的。RISC-V指令集被设计为简洁、精简和灵活,旨在满足各种应用领域的需求。 RISC-V是一个以精简指令集(Reduced Instruction Set Computing)为基础的架构,它的设计原则是简化指令集并提高性能。它的指令集被划分为几个基本类别,包括整数运算、浮点运算、向量操作和特权指令等。 RISC-V架构的一大特点是可扩展性。它支持不同的扩展,并允许用户根据自己的需求添加自定义的指令集扩展,从而提高系统的效率和灵活性。这种可扩展性使得RISC-V架构适用于不同的应用领域,包括嵌入式系统、移动设备和高性能计算等。 另外,RISC-V指令集还支持虚拟化和多核处理。虚拟化技术使得多个虚拟机能够在同一硬件平台上同时运行,提高了系统资源的利用率。多核处理技术则能够实现并行计算,加快处理速度。 总之,RISC-V指令集是一种开放、免费、精简、灵活和可扩展的架构,适用于各种应用领域。它的设计原则是以性能为导向,提供高效的计算能力,并支持虚拟化和多核处理技术。随着RISC-V的不断发展,相信它将会在未来成为更多系统和设备的首选指令集。 ### 回答3: RISC-V指令集是一种开放的指令集架构,它的设计目标是简化指令集,提高性能,并且便于扩展。RISC是“精简指令计算机”的缩写,它强调指令集的精简和效率。而V代表RISC-V是一个可扩展的指令集,可以根据需求进行定制和扩展。 RISC-V指令集以其开放性和可移植性而受到广泛关注。相比于其他商业化指令集架构,RISC-V的设计是开放源代码的,这意味着任何人都可以自由使用、修改和定制RISC-V架构的指令集并开发相关的硬件和软件。 RISC-V指令集的设计也注重了性能和效率。它采用了简化、统一的指令格式和指令集拓展的方式,使得处理器可以更高效地执行指令。在指令集拓展方面,RISC-V提供了可选的标准拓展,如整数拓展、浮点数拓展和向量拓展,以满足各种应用领域的需求。 通过RISC-V的可扩展性,用户可以根据自己的需求定制指令集。这意味着用户可以根据具体应用的特点和需求,选择适当的指令集拓展,并进行针对性的优化。这种定制化的设计使得RISC-V可以应用于各种领域,如嵌入式系统、服务器和超级计算机等。 总结来说,RISC-V指令集是一种开放、简化、高效和可扩展的指令集架构。它的开放性使得任何人都可以自由使用和定制,而其简化和高效的设计则使得处理器可以高效地执行指令。通过可选的指令集拓展,用户可以根据不同应用领域的需求进行定制,使得RISC-V可以广泛应用于各种领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值