当前位置: 首页 > news >正文

risc-V学习日记(4):RV32I指令集

这一期我们重新回到RISC-V的内容说明。

请添加图片描述

文章目录

  • 基本指令集
    • 指令格式
    • 指令集功能分类
    • 指令集总览
  • 指令详细说明
    • 1. 高位立即数与地址构造
      • LUI 代码演示
    • 2. 控制转移指令
      • 无条件跳转
      • JALR代码演示
      • 条件分支
      • BNE代码演示
    • 3. 内存访问指令
      • 加载指令
      • 存储指令
    • 4. 整数运算指令
      • 立即数运算
      • ADDI代码演示
      • 移位运算
      • SLLI代码演示
      • 寄存器-寄存器运算
      • ADD代码演示
    • 5. 系统与同步指令
  • 结语
  • 感谢大伙观看,别忘了三连支持一下
  • 大家也可以关注一下我的其它专栏,同样精彩喔~
  • 下期见咯~

基本指令集

指令格式

在基本ISA中,有四种核心指令格式(R/I/S/U),如图 2.2所示。所有的指令都是固定32位长度的,并且在存储器中必须在4字节边界对齐。当发生一个条件分支或者无条件转移而且目标地址不是对齐到4字节时, 将会产生一个指令地址不对齐的异常。 如果条件分支没有发生(not taken),那么将不会产生一个取指不对齐异常。
在这里插入图片描述

基于立即数处理,还有额外两种指令格式变种(SB/UJ)
在这里插入图片描述

指令集功能分类

RV32I指令集按照指令功能可以分为5类。

  1. Integer Computational Instructions【整数计算指令,下称使用中文】
  2. Loads and Store Instructions【访存指令】
  3. Control Transfer Instructions【控制转移指令】
  4. Memory Ordering Instructions【内存顺序指令】
  5. Environment Call and Breakpoints【环境调用和断点】

这5类指令包括了一种或多种指令格式,下面分类给出各部分指令的简要功能介绍。

指令集总览

RV32I 基本指令集有47条指令,如下图:
在这里插入图片描述
是不是很多,这里给大伙提供一个网站,可以在线直接查看 Risc-V的指令功能 —— 跳转链接
在这里插入图片描述

指令详细说明

1. 高位立即数与地址构造

指令格式功能描述示例
LUIlui rd, imm将 20 位立即数 imm 左移 12 位,写入 rd 的高位,低位补 0。lui x5, 0x12345 → x5 = 0x12345000
AUIPCauipc rd, imm将 PC 当前值 + (imm << 12),结果写入 rd,用于构造全局地址或远跳转。auipc x6

LUI 代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:lui x5, 0x12345		# int x5 = 0x12345 << 12addi x5, x5, 0x678	# x5 = x5 + 0x678
stop:j stop			# Infinite loop to stop execution.end			# End of file

在这里插入图片描述

2. 控制转移指令

无条件跳转

指令格式功能描述示例
JALjal rd, offset跳转到 PC + offset,并将返回地址 PC+4 存入 rd(通常 rd=x1)。jal x1, func → 调用函数 func
JALRjalr rd, rs1, imm跳转到 rs1 + imm(地址最低位强制为 0),返回地址 PC+4 存入 rd。jalr x0, x1, 0 → 跳转到 x1 并返回

JALR代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:li x6, 1li x7, 2jal x5, sum		# call sum, return address is saved in x5stop:j stop			# Infinite loop to stop executionsum:add x6, x6, x7		# x6 = x6 + x7jalr x0, 0(x5)		# return.end			# End of file

在这里插入图片描述

条件分支

指令格式功能描述示例
BEQbeq rs1, rs2, offset若 rs1 == rs2,跳转到 PC + offset。beq x5, x6, loop → 相等则循环
BNEbne rs1, rs2, offset若 rs1 != rs2,跳转。bne x5, x0, exit → 非零则退出
BLTblt rs1, rs2, offset若 rs1 < rs2(有符号比较),跳转。blt x5, x6, less
BGEbge rs1, rs2, offset若 rs1 >= rs2(有符号比较),跳转。bge x5, x6, greater_eq
BLTUbltu rs1, rs2, offset若 rs1 < rs2(无符号比较),跳转。bltu x5, x6, uless
BGEUbgeu rs1, rs2, offset若 rs1 >= rs2(无符号比较),跳转。bgeu x5, x6, ugreater_eq

BNE代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:# i = 0# while (i < 5) i++;li x5, 0li x6, 5
loop:addi x5, x5, 1bne x5, x6, loopstop:j stop			# Infinite loop to stop execution.end			# End of file

在这里插入图片描述

3. 内存访问指令

加载指令

指令格式功能描述示例
LBlb rd, offset(rs1)从 rs1 + offset 加载字节(符号扩展后写入 rd)。lb x5, 4(x6) → 加载字节到 x5
LHlh rd, offset(rs1)加载半字(符号扩展)。lh x5, -8(x6)
LWlw rd, offset(rs1)加载字(32 位数据)。lw x5, 0(x6)
LBUlbu rd, offset(rs1)加载无符号字节(高位补 0)。lbu x5, 3(x6)
LHUlhu rd, offset(rs1)加载无符号半字(高位补 0)。lhu x5, 2(x6)

存储指令

指令格式功能描述示例
SBsb rs2, offset(rs1)将 rs2 的低 8 位存储到 rs1 + offset。sb x5, 10(x6) → 存储字节
SHsh rs2, offset(rs1)存储低 16 位。sh x5, -4(x6)
SWsw rs2, offset(rs1)存储 32 位。sw x5, 0(x6)

4. 整数运算指令

立即数运算

指令格式功能描述示例
ADDIaddi rd, rs1, immrs1 + 符号扩展的12位立即数,结果写入 rd。addi x5, x6, -5 → x5 = x6 -5
SLTIslti rd, rs1, imm若 rs1 < imm(有符号比较),则 rd=1,否则 rd=0。slti x5, x6, 10 → 检查是否小于 10
SLTIUsltiu rd, rs1, imm无符号比较 rs1 < imm,结果写入 rd。sltiu x5, x6, 0xFFF
XORIxori rd, rs1, immrs1 ^ 符号扩展的立即数。xori x5, x6, 0xFFFF → 按位取反
ORIori rd, rs1, immrs1符号扩展的立即数。
ANDIandi rd, rs1, immrs1 & 符号扩展的立即数。andi x5, x6, 0xFF → 取低8位

ADDI代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:li x6, 2		# x6 = 2addi x5, x6, 1		# x5 = x6 + 1stop:j stop			# Infinite loop to stop execution.end			# End of file

在这里插入图片描述

移位运算

指令格式功能描述示例
SLLIslli rd, rs1, shamt逻辑左移 rs1,移位数为 shamt(0-31),结果写入 rd。slli x5, x6, 2 → x5 = x6 << 2
SRLIsrli rd, rs1, shamt逻辑右移(高位补 0)。srli x5, x6, 3
SRAIsrai rd, rs1, shamt算术右移(高位补符号位)。srai x5, x6, 4

SLLI代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:li x6, 1		# x6 = 1slli x5, x6, 3		# x5 = x6 << 3stop:j stop			# Infinite loop to stop execution.end			# End of file

在这里插入图片描述

寄存器-寄存器运算

指令格式功能描述示例
ADDadd rd, rs1, rs2rs1 + rs2,结果写入 rd。add x5, x6, x7
SUBsub rd, rs1, rs2rs1 - rs2。sub x5, x6, x7
SLLsll rd, rs1, rs2逻辑左移 rs1,移位数为 rs2 的低 5 位。sll x5, x6, x7
SLTslt rd, rs1, rs2若 rs1 < rs2(有符号比较),则 rd=1,否则 rd=0。
SLTUsltu rd, rs1, rs2无符号比较 rs1 < rs2,结果写入 rd。sltu x5, x6, x7
XORxor rd, rs1, rs2按位异或。xor x5, x6, x7 → x5 = x6 ^ x7
SRLsrl rd, rs1, rs2逻辑右移(高位补 0)。srl x5, x6, x7
SRAsra rd, rs1, rs2算术右移(高位补符号位)。sra x5, x6, x7
ORor rd, rs1, rs2按位或。or x5, x6, x7 → x5 = x6
ANDand rd, rs1, rs2按位与。and x5, x6, x7 → x5 = x6 & x7

ADD代码演示

	.text			# Define beginning of text section.global	_start		# Define entry _start_start:li x6, 1		# x6 = 1li x7, 2		# x7 = 2add x5, x6, x7		# x5 = x6 + x7stop:j stop			# Infinite loop to stop execution.end			# End of file

在这里插入图片描述

5. 系统与同步指令

指令格式功能描述示例
FENCEfence 内存屏障,确保其前后的内存访问顺序。fence → 保证访存顺序
ECALLecall 触发环境调用(如系统调用或切换到更高权限模式)。ecall → 执行系统调用
EBREAKebreak 触发调试断点,通常用于调试器介入。ebreak → 进入调试模式

结语

这一期讲了RV32I的所有指令集,下一期我们来看看指令在CPU中是经过了那些过程才最终实现出来的。

感谢大伙观看,别忘了三连支持一下

大家也可以关注一下我的其它专栏,同样精彩喔~

下期见咯~

请添加图片描述

http://www.xdnf.cn/news/178669.html

相关文章:

  • 开关电源实战(六)ADDC反激电源
  • 说一下Drop与delete区别
  • 在java中实现protobuf自定义协议
  • 通过ThreadLocal存储登录用户信息
  • LeetCode每日一题4.27
  • 【HPC存储性能测试】01-OpenMPI部署
  • 深入理解指针(5)
  • 【Leetcode 每日一题】3392. 统计符合条件长度为 3 的子数组数目
  • lobechat调用ollama模型,服务连接失败
  • UE5 NDisplay 单主机打包运行
  • SaaS方兴未艾,快速稳定的访问与全面的安全防护成关键
  • 典籍查询界面增加我的收藏查询功能
  • AI 数据中心 vs 传统数据中心:从硬件架构到网络设计的全面进化
  • 0基础 | Proteus | 中断 | 点阵
  • keil 中优化等级的bug
  • 泰迪杯实战案例超深度解析:旅游景点游客流量预测与资源优化
  • Zabbix
  • 测试基础笔记第十四天
  • Java基础——排序算法
  • 底层源码和具体测试解析HotSpot JVM的notify唤醒有序性(5000字详解)
  • 优化无头浏览器流量:使用Puppeteer进行高效数据抓取的成本降低策略
  • PHP实现 Apple ID 登录的服务端验证指南
  • 现代Python打包工具链
  • Redis的阻塞
  • AI赋能智能对讲机:技术融合与行业变革的深度实践
  • 【计算机网络性能优化】从基础理论到实战调优
  • 97A6-ASEMI无人机专用功率器件97A6
  • (25)VTK C++开发示例 --- 将点坐标写入.xyz文件
  • Java基础 — 数组
  • Spark-Streaming(四)