首页 > 其他分享 >RISC-V 指令

RISC-V 指令

时间:2023-07-02 23:56:05浏览次数:47  
标签:寄存器 imm RISC 指令 跳转 type


1. 寄存器相关

  • RISC-V 架构可选32bit(RV32)/64bit(RV64),可选32个寄存器(I架构)/16个寄存器(E架构)。
    • 考虑整数通用寄存器组:其中0寄存器被预留为常数0,其余31/15个寄存器为通用整数寄存器。
    • 考虑浮点寄存器组(一般为F/D类扩展指令集),有32个通用浮点寄存器;寄存器位宽由扩展指令集类型决定,F类:单精度、32bit,D类:双精度、64bit。
  • RISC-V 的汇编语言是对寄存器的数据进行处理。
    • 算术运算(加、减、立即数加)。
    • 数据传输(取:从存储器取数据到寄存器;存:从寄存器读数据存到存储器,更多关于存储器访问指令下面有介绍)。
    • 逻辑运算(与,或,异或...)。
    • 移位操作(逻辑左/右移,算数左/右移)。
    • 条件分支(相等、不等、大于、小于跳转)。
    • 无条件跳转(跳转 - 链接)。
  • 存储器访问指令
    • 对于更复杂的数据结构(例如数组和结构体)包含比寄存器更多的数据元素,只能存放于存储器中,使用数据传输指令进行读取。
    • 与RISC架构策略一致,只有Load和Store指令可以访问存储器,其它指令都不可访问存储器。
    • 存储器读写指令基本单位是字节(Byte)。
    • RISC-V架构存储模式只支持小端格式。
    • RISC-V推荐使用地址对齐的存储器读写操作,但也支持地址非对齐。
    • RISC-V架构的存储器读写指令不支持地址自增/自减的模式。

2. RV32I 指令格式

  • 下图介绍了六种基本指令格式
  • R-type
    • 实现rs1,rs2两个寄存器的值运算,并将运算后的结果存在rd中。opcode 和 func 共同决定实现哪种运算。
  • I-type
    • 可以实现带一个常数的算数指令以及Load指令。 注意immediate字段为补码值。
    • 对于Load指令:可以取相对于rd中的基地址+imm字节的数据。
      • 例如下面的指令,从x22寄存器中获取基地址,并加上偏移地址(64/8bit = 8Byte) ,取出字,放到x9寄存器中。
        • 其中(x)22放在rs1寄存器中,(x)9放在rd字段,64放在imm字段。
        lw x9, 64(x22)
        
    • 考虑到逻辑操作中的移位,使用的也是I型指令格式,考虑到寄存器位宽为32bit,所以shamt也不会超过32,所以imm只需要划出5bit空间,其余几bit作为额外的操作码字段。
  • S-type
    • 用于Store指令,immediate字段仍为补码值。
    • 存在两个源寄存器,一个存放基址,一个存放数据。
    • 设计选择与R-type保持类似的指令格式,将imm进行拆分,可以一定程度降低硬件的复杂性。
      • 例如下面的指令,x9中写着要存入的值,x10中写着存储器基地址,并加上偏移地址(240/8bit = 30Byte)。
        • 其中(x)9放在rs2字段中,(x)10放在rs1字段中,240放在imm字段中(要被拆分)。
        sw x9, 240(x10)
        
  • U-type
    • I、S型指令格式中已经有12bit imm,但是需要考虑有时常数很大,12bit不够,此时可以使用LUI指令。
      • 将高20bit常数加载到寄存器的第31-12bit,低12bit用常数0填充。之后可以使用 addi 指令与低12bit立即数相加,以实现对32bit寄存器数值的配置。
      • 上面介绍的ADDI和LUI指令结和还需注意一个问题,即如果ADDI的立即数将本来一个数据为设置为一个符号位,可能会造成一个数据缺口,需要进行补值。相关处理可以看这篇文章
  • B-type
    • 比较两个源寄存器rs1和rs2,并进行跳转。
    • 例子如下:
      • 指令格式上可以看到imm[0]被舍弃掉了,因为该bit被设置为0;汇编器根据label的地址计算出相对的偏移量为16bytes = 'b1_0000,映射如下图。
      beq x19, x10, label
      
    • 看到这里,其实就会有一个疑问,为什么B型和J型立即数在inst中分散的奇奇怪怪,但是寄存器却是固定位置的,知乎上搜到了这个问题的一些回答。我认为其中有一个解释的很有道理,为了平衡(寄存器索引到读出寄存器值的时间)和(通过inst生成参与操作的立即数选择逻辑的时间),提高整体的运算速度。
  • J-type
    • 主要用在无条件跳转指令jal和jalr上。
      jal rd, label
      jalr rd, rsl, imm
      
    • jal
      • 主要实现两步:
        • J-type和前面介绍的B-type一样,舍弃掉imm[0],强制设置该bit为0;将imm偏移量加到该指令的PC值,得到最终跳转目标地址。RV32I的J指令格式中imm有21bit,但是imm[0]被舍弃掉了,因此可以跳转±2^(21-1) = ±1MB,其中21-1是因为有1bit的符号位。
        • 并且将下一条指令的PC(当前指令PC值+4)写入寄存器rd中。+4是因为对于RV32I来说,其指令长度为4个字节,且使用字节寻址。将下一条地址写入寄存器中,是为返回做准备。
    • jalr
      • !!注意,jalr不是J型指令格式而是I型指令格式。
      • imm的12bit立即数为偏移量,基地址保存在rs1中,两者相加为最终跳转的目标地址。只能跳转±2KB(2^11=2KB,去掉符号位)。
      • jalr也需要将下一条指令的PC值写入rd寄存器中。

标签:寄存器,imm,RISC,指令,跳转,type
From: https://www.cnblogs.com/qianbinbin/p/17521025.html

相关文章

  • Intel x86s 架构是一种广泛应用于个人电脑和服务器的指令集架构。它由英特尔公司于上
    Intelx86s架构是一种广泛应用于个人电脑和服务器的指令集架构。它由英特尔公司于上世纪70年代末开发,并在其后几十年中不断演进和扩展。x86s架构的原理主要包括以下几个方面:指令集:x86s架构采用复杂指令集计算机(CISC)的设计思想,提供了大量的指令集,使得程序员可以用更高级的指令......
  • 最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优
    Linux命令相关查看指标CPU指标vmstat指令vmstat-nm该命令用于每隔n秒采集系统的性能统计信息,共采集m次。[root@svr01]$vmstat13procs-----------memory-------------swap-------io------system-------cpu-----rbswpdfreebuffcachesiso......
  • git指令
    git指令gitinit//初始化仓库gitaddreadme.txt//选中单个文件gitadd.//选中全部文件gitcommit-m"要备注的信息"//把文件提交到仓库........................................................gitstatus//查看一下仓库当前的状态比如哪个文件修改了什么......
  • tmux使用指令
    nohuppythonmain.py&进入后台的终端tmuxattach-tyhl查看所有的tmuxls新开终端tmuxnew-syhl一个终端分上下2个,进入下面的终端ctrl+b,箭头下离开当前终端,后台运行tmaxdetach或者按键ctrl+bd关闭终端tmuxkill-session-t或者ctrl+d分屏左......
  • JVM指令集
    目录JVM指令集常量操作码(Constants)0nop1aconst_null2-8iconst_<i>9-10lconst_<i>11-13fconst_<i>14-15dconst_<i>16bipush17sipush18ldc19ldc_w20ldc2_w加载操作码(Loads)21-25<t>load26-45<t>load_<i>46-53<t>aload储存字节码(S......
  • cmake之configure_file指令
    [!note]需要知道最基本的cmake使用方法和命令。project、cmake_minimum_required、add_executable、target_include_directories等指令官网给的指令格式如下:```cmakeconfigure_file(<input><output>[NO_SOURCE_PERMISSIONS|USE_SOURCE_PERMISSIONS|......
  • 汇编指令--pushf,popf
           ......
  • 【Linux基本指令(2)】几十条指令快速入手Linux_深入理解什么是指令
    本文思维导图:@TOCTips:*号匹配。功能:可以匹配任何东西。比如:可以看到,*号可以匹配任何东西,2.ctrl+c指令:终止因为程序或者指令异常,而导致我们无法进行指令输入。3.Linux下一切皆文件对于显示器来说,显示器文件有写方法(fwrite),有读方法(fread),但是读方法为空。对于键盘文件来说,键盘文......
  • Self-Instruct 论文解读:利用大模型自己给自己生成指令数据,指令数据自动生成
    总览大规模“指令调整”的语言模型,即指令微调的LLM,已经表现出非凡的零样本能力,尤其是推广新任务上。然而,这些模型严重依赖于人类编写的指令数据,而这些数据通常在数量、多样性和创造力方面受到限制,因此阻碍了调整模型的通用性。基于上述背景,作者提出了Self-instruct框架,一个通过......
  • ChatGPT 指令知识要点
     ChatGPT从入门到精通,一站式掌握办公自动化/爬虫/数据分析和可视化图表制作全面AI时代就在转角道路已经铺好了“局外人”or“先行者”就在此刻等你决定。。。。。还有更多。。。。,联系我,一起学起来,行动起来吧ChatGPT指令知识要点指令越精确,ChatGPT回答会越到位。我们介绍11类......