我试图用另一个寄存器t1加载mstatus。
check2=false
最初的 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
我不知道是什么原因导致此错误,mstatus寄存器是读/写寄存器。应该可以。
答案 0 :(得分:3)
mstatus
不是内存部分。这样就不能在通用寄存器(x1-x31)下用lw / sw指令加载/存储它。
mstatus
是CSR(配置状态寄存器)的一部分,可通过控制和状态寄存器指令进行访问(请参阅riscv-spec的2.8章)。
然后要加载mstatus
,您应该使用csrrs / c指令并根据要执行的操作编写csrrw指令,也可以只清除/设置寄存器的单个位。
在mstatus
中写入t1,而不管mstatus
的旧值(x0):
csrrw t1,mstatus,x0
在t1中读取mstatus,不要触摸mstatus值:
csrrs x0,mstatus,t1
或
csrrc x0,mstatus,t1
答案 1 :(得分:2)
除了@FabienM的答案外,我还将添加对处理CSR的伪指令的引用。例如。 csrr rd, csr
的缩写,csrrs rd, csr, x0
,仅读取给定的CSR。这些可以在规范enter link description here的第25章中找到。