RISCV的寻址方式
0. 介绍
RISCV有 32 个寄存器加一个 pc 寄存器 (RV32I): x0 ~ x31,pc
x[rs1]
为 获取 寄存器 rs1 的值sext(offset)
为 offset 进行无符号扩展,扩展位数取决于 isaM[XXX]
为 访存,地址为XXX
1. 立即数寻址
addi t0, a0, 1234
加立即数(算术指令), t0 = a0 + 1234,这里1234就是立即数寻址
2.寄存器寻址
add a1, s1, s0
加操作, a1 = s0 + s1,这里a1 s0 s1都是寄存器寻址
3.访存寻址
访问内存中的数据,或者将寄存器的数据存入内存
3.1寄存器相对寻址
lw rd, offset(rs)
x[rd] = sext(M[x[rs1] + sext(offset)][31:0])
访存地址 addr 为 rs 中存放的地址加上偏移量 offset。将内存中地址 addr 的数据放入 rd 寄存器
3.2寄存器直接寻址
riscv 是通过 寄存器相对寻址中偏移 设置为 0 实现的
lw rd, 0(rs)
x[rd] = sext(M[x[rs1]][31:0])
访存地址 addr 为 rs 中存放的地址。将内存中地址 addr 的数据放入 rd 寄存器
PC相对寻址
常见于 B 型指令
blt rs1, rs2, offset
if (x[rs1] < x[rs2]) pc += sext(offset)
如果 寄存器 rs1 的值小于 寄存器 rs2 的值,则跳转至当前 pc + offset 处
作者:odjvnrij 创建时间:2024-10-12 14:58
最后编辑:odjvnrij 更新时间:2024-12-27 17:52
最后编辑:odjvnrij 更新时间:2024-12-27 17:52