RISC-V指令集介绍 - 整数基本指令集
1. 寄存器
32个x寄存器,RV32下x reg是32位宽
x0:硬连线 常数0 专门的零寄存器
x1-x31:31个通用reg
返回地址:没有强制要求那一个x作为lr,但是一般用x1
pc:额外的用户可见寄存器
2. 基本指令格式
四种基础指令格式 R/I/S/U
imm:立即数
rs1:源寄存器1
rs2:源寄存器2
rd:目标寄存器
opcode:操作码
example: C.LI 指令被扩展为 addi rd, x0, imm[5:0]。
3 整形运算
使用R或者I类指令
R类:寄存器-立即数
I类:寄存器-寄存器
整数计算不会造成运算异常
寄存器-立即数:
ADDI:将12位有符号立即数和rs相加,溢出忽略,直接使用结果的最低32bit,并存入rd
伪指令MV:"MV rd,rs"实际上是"ADDI rd, rs, 0"
SLTI:如果rs小于立即数(都是有符号整数),将rd置1,否则置0
SLTIU:和SLTI一致,不过都是无符号数
伪指令SEQZ:"SEQZ rd, rs" 实际上是 "SLTIU rd, rs1, 1"
ANDI/ORI/XORI:rs与有符号12位立即数进行and,or,xor操作
伪指令NOT:"NOT rd, rs"实际上是"XORI rd, rs1, -1"
shift是I类指令格式
SLLI:逻辑左移,低位移入0
SRLI:逻辑右移,高位移入0
SRAI:算数右移,符号移入高位
u类指令格式
LUI:创建32位无符号整数,存放立即数到rd的高20位,低12位置0
AUIPC:创建pc的相对地址,pc+无符号立即数(偏移量)=>rd
寄存器-寄存器:
ADD/SUB:rs1(+/-)rs2 => rd
SLT/SLTU: 如果rs1<rs2,rd写1; 否则rd为0
AND/OR/XOR: rs1与rs2进行and,or,xor操作
SLL/SRL/SRA: 和"寄存器-立即数"指令一致,将r2的低5位作为立即数即可
NOP指令:
实际上是ADDI x0,x0,0
4. 控制传输指令
1)非条件跳转:
JAL:J类指令,立即数+pc为跳转目标,rd存放pc+4(返回地址)
跳转范围为pc(+/-)1MB
JALR:I类指令,rs+立即数为跳转目标,rd存放pc+4(返回地址)
实现远跳转
2)条件跳转
所有分支指令使用B类指令格式,12位立即数+pc作为目标
跳转范围为pc(+/-)4KB
BEQ/BNE:rs1(==/!=)rs2, 分别在相等或者不等时,发生跳转
BLT:rs1 < rs2, 跳转
BGE:rs1 >= rs2, 跳转
5 加载存储指令
RV32I是一个加载/存储架构,只有load/store能访问内存,运算指令只操作寄存器
load是I类指令,store是S类指令
LOAD:rs作为基地址,加上有符号的偏移,读取到rd寄存器
STORE:rs1作为基地址加上有符号的偏移,作为内存地址,写入内容为rs2
6. 控制状态寄存器指令
寄存器-寄存器:读/写/修改 CSR
CSRRW:Atomic Read/Write CSR
读取CSR的值存入rd寄存器,并将rs存入CSR
另外:如果rd为x0,将不会执行
CSRRS:Atomic Read and Set Bits in CSR
读取CSR的值存入rd寄存器,并根据rs中高位对CSR置1
另外:如果rs为x0,将不会执行
CSRRC:Atomic Read and Clear Bits in CSR
读取CSR的值存入rd寄存器,并根据rs中高位对CSR置0
另外:如果rs为x0,将不会执行
立即数-寄存器:读/写/修改 CSR
CSRRWI/CSRRSI/CSRRCI
将CSRRW类寄存器中的rs换成立即数
另外:如果立即数为0,将不会执行
用户级系统指令:时钟和计数器
RV32I提供三个64位只读用户级寄存器:RDCYCLE[H]/RDTIME[H]/RDINSTRET[H]
使用CSRRS读取这三个寄存器的高32 bit
RDCYCLE:时钟周期计数
RDTIME:时间 tick数
RDINSTRET:指令数
参考文档: https://blog.csdn.net/zhangshuaiisme/article/details/80718496
RISC-V指令集介绍 - 整数基本指令集的更多相关文章
- 常见的CPU指令集介绍
本文摘自网络 一.X86 是微处理器执行的计算机语言指令集,指一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合,属于CISC. 1.1.简介 X86指令集是美国Intel ...
- JVM指令集介绍
转载自:http://glutinit.iteye.com/blog/1263446 延伸参考 JVM接收参数和方法调用 void spin() { int i; for (i = 0 ...
- RV32I基础整数指令集
RV32I是32位基础整数指令集,它支持32位寻址空间,支持字节地址访问,仅支持小端格式(little-endian,高地址高位,低地址地位),寄存器也是32位整数寄存器.RV32I指令集的目的是尽量 ...
- RISC指令集的五个周期
RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...
- 自己动手写处理器之第一阶段(3)——MIPS32指令集架构简单介绍
将陆续上传本人写的新书<自己动手写处理器>(尚未出版).今天是第四篇.我尽量每周四篇 1.4 MIPS32指令集架构简单介绍 本书设计的处理器遵循MIPS32 Release 1架构,所以 ...
- 常用 ARM 指令集及汇编
ARM7TDMI(-S)指令集及汇编 ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制 较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 T ...
- 计算机系统6-> 计组与体系结构3 | MIPS指令集(中)| MIPS汇编指令与机器表示
上一篇计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统从顶层讲解了一个指令集 / 指令系统应当具备哪些特征和工作原理.这一篇就聚焦MIPS指令集(MIPS32),看看其汇 ...
- X86架构CPU常识(主频,外频,FSB,cpu位和字长,倍频系数,缓存,CPU扩展指令集,CPU内核和I/O工作电压,制造工艺,指令集,超流水线与超标量)
1.主频 主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度. CPU的主频=外频×倍频系数.很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对于服务器来讲,这个认识也出现了偏差. ...
- 计算机系统5-> 计组与体系结构2 | MIPS指令集(上)| 指令系统
系列的上一篇计算机系统4-> 计组与体系结构1 | 基础概念与系统评估,学习了一些计算机的基础概念,将一些基本的计算机组成部分的功能和相互联系了解了一下,其中很重要的一个抽象思想就是软硬件的接口 ...
随机推荐
- tomcat修改banner,隐藏版本号
为了避免黑客针对某些版本进行攻击,因此我们需要隐藏或者伪装 Tomcat 的版本信息.针对该信息的显示是由一个jar包控制的,该jar包存放在 Tomcat 安装目录下的lib目录下,名称为 cata ...
- python3 第三十二章 - 标准库概览
1. 操作系统接口 os 模块提供很多函数与操作系统进行交互︰ >>> import os >>> os.getcwd() # 返回当前的工作目录 'C:\\Pyt ...
- 【MySQL】初识数据库及简单操作
一.数据库概述 1.1 什么是数据(Data) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算机. ...
- DWR使用总结
这两天学了下DWR,现在总结一下. DWR是方便使用AJAX连接JS和JAVA的的一个框架,把服务器端 Java 对象的方法公开给 JavaScript 代码. 如果是用dwr2.0的jar包,还 ...
- Springboot & Mybatis 构建restful 服务三
Springboot & Mybatis 构建restful 服务三 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务二 2 restful ...
- pyc文件
1.pyc文件 是python预编译后的字节码文件,并不是机器码.2.PyCodeObject 是Python编译器真正编译成的结果: 当python程序运行时,编译的结果是保存在PyCodeObje ...
- 《团队-爬取豆瓣top250-开发文档》
项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 本项目能够爬取豆瓣电影TOP250并向用户展示电影的排名,分数等
- 采用Google预训bert实现中文NER任务
本博文介绍用Google pre-training的bert(Bidirectional Encoder Representational from Transformers)做中文NER(Name ...
- sjms-3 结构型模式
结构型模式 适配器模式 内容:将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.两种实现方式:类适配器:使用多继承对象适配器:使用组合 角色 ...
- Java 包与类的命名(util、service、tool、dao )区别
util 通用的.与业务无关的,可以独立出来,可供其他项目使用.方法通常是public static,一般无类的属性,如果有,也是public static. service 与某一个业务有关,不是通 ...