为 RISC-V 设置状态寄存器



我正在尝试使用另一个寄存器 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 

初始lw t1, mstatus工作正常。但是,当尝试lw mstatus, t1汇编程序时,会给出

Error: illegal operands 'lw mstatus, t1'

我不知道是什么原因导致此错误,mstatus 寄存器是一个读/写寄存器。它应该有效。

mstatus

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

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

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

mstatus中写 t1,而不关心旧值 (x0(mstatus

CSRRW T1, mstatus , x0

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

CSRrs X0, mStatus , T1

CSRRC X0, mstatus, T1

除了@FabienM的回答之外,我还会添加对处理 CSR 的伪指令的引用。csrr rd, csr这是csrrs rd, csr, x0的缩写,只是读取给定的 CSR。这些可以在RISC-V指令集手册第一卷:非特权ISA的第9.1章"CSR指令"中找到。

最新更新