RISCV的寻址方式

  1. 立即数寻址
  2. 寄存器寻址
  3. 访存寻址
    3.1 寄存器相对寻址
    3.2 寄存器直接寻址
  4. PC相对寻址

0. 介绍

RISCV有 32 个寄存器加一个 pc 寄存器 (RV32I): x0 ~ x31,pc

x[rs1] 为 获取 寄存器 rs1 的值
sext(offset) 为 offset 进行无符号扩展,扩展位数取决于 isa
M[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