为 RISC-V 设置 mstatus 寄存器

Iva*_*van 4 riscv

我正在尝试使用另一个寄存器 t1 加载 mstatus。

 lw t1, mstatus              # load mstatys register into t1
 xori t1, t1, 0x8            # xor mstatus to set 3rd bit and leave everything else as is
 lw mstatus, t1              # set mstatus 
Run Code Online (Sandbox Code Playgroud)

最初的lw t1, mstatus作品很好。然而,当试图lw mstatus, t1汇编程序给出

Error: illegal operands 'lw mstatus, t1'
Run Code Online (Sandbox Code Playgroud)

我不知道是什么导致了这个错误,mstatus 寄存器是一个读/写寄存器。它应该工作。

Fab*_*enM 5

mstatus不是内存部分。然后它不能在通用寄存器(x1-x31)下用 lw/sw 指令加载/存储。

mstatus是通过控制和状态寄存器指令访问的 CSR(配置状态寄存器)的一部分(参见riscv-spec 的第 2.8 章)。

然后加载mstatus你应该使用 csrrs/c 指令并根据你想要做什么来编写 csrrw 指令,你也可以只清除/设置寄存器的单个位。

将 t1 写入mstatus并且不关心mstatus旧值 (x0):

csrrw t1, mstatus, x0

读取 t1 中的 mstatus 并且不要触摸 mstatus 值:

csrrs x0, mstatus, t1

或者

csrrc x0, mstatus, t1


小智 5

除了 @FabienM\xe2\x80\x98s 答案之外,我还会添加对处理 CSR 的伪指令的引用。例如csrr rd, csr,它是给定 CSR 的缩写csrrs rd, csr, x0,仅读取给定的 CSR。这些可以在《RISC-V 指令集手册第一卷:非特权 ISA》的第 9.1 章“CSR 指令”中找到。

\n