andeyqi 发表于 2024-11-24 12:54

【读书】《RISC-V 体系结构编程与实践(第2版)》-- RISC-V 存储加载指令集学习

本帖最后由 andeyqi 于 2024-11-24 22:35 编辑

## 简介
RISC-V 指令按照类型分为6种,对应指令编码格式如下。

- R类型:寄存器与寄存器算术指令。
- I类型:寄存器与立即数算术指令或者加载指令。
- S类型:存储指令。
- B类型:条件跳转指令。
- U类型:长立即数操作指令。
- J类型:无条件跳转指令。

以下是 RV32I 基础指令集所包含的指令

RV64I 指令相对RV32I 增加了部分指令,这也体现了RISC-V 指令集模块化的设计方式


### 存储与加载指令
RISC-V 架构是基于存储加载的设计方式,CPU 访问内存不可以直接从将数据写入内存,需要通过过寄存器将要写的数据先写入寄存器,让后将寄存器数据加载到内存,所以存储与加载指令只是最基本的指令。
#### 加载指令
以下是加载指令编码格式

对应ld 指令说明如下


以下是书中对ld 指令的测试代码


上述代码使用LD指令load 0x8000000 + offset 的memory 书籍至寄存器,书中使用的验证环境为QEMU ,本地使用 rars 软件验证上述ld 指令运行效果。

添加如下测试代码
```c
li t0,0x10010010

lb t1,(t0)
lb t2,4(t0)
lbu t3,4(t0)
lb t4,-4(t0)
ld t5,(t0)
ld t6,16(t0)
```
运行后结果如下,发现按照预期的方式将内存的数据加载到t1-t6 寄存器中。


#### 存储指令

以下是store 指令的编码说明



我们在之前的代码基础上添加代码将t1-t6 的寄存器内容写入到内存中
```c
li t0,0x10010010

lb t1,(t0)
lb t2,4(t0)
lbu t3,4(t0)
lb t4,-4(t0)
ld t5,(t0)
ld t6,16(t0)

li a0,0x10010040
sb t1,(a0)
sb t2,4(a0)
sw t3,8(a0)
sw t4,12(a0)
sd t5,16(a0)
sd t6,24(a0)
```

运行后发现t1-t6 寄存器的数值已经通过a0寄存器写入到内存中了。


学学学学学学学 发表于 2024-12-3 15:08

<p>rars 这个软件有下载链接吗大佬</p>

andeyqi 发表于 2024-12-3 17:45

学学学学学学学 发表于 2024-12-3 15:08
rars 这个软件有下载链接吗大佬

<p>https://github.com/TheThirdOne/rars</p>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【读书】《RISC-V 体系结构编程与实践(第2版)》-- RISC-V 存储加载指令集学习