riscv - 为 RISC-V 设置 mstatus 寄存器

标签 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 

初始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 指令,您也可以只清除/设置寄存器的单个位。

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

csrrw t1, mstatus, x0



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

csrrs x0, mstatus, t1



或者

csrrc x0, mstatus, t1

关于riscv - 为 RISC-V 设置 mstatus 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59524849/

相关文章:

assembly - 如何在汇编宏中以立即值作为参数编写 riscv CSR?

assembly - %pcrel_hi 和 %pcrel_lo 实际上做了什么?

compression - 如何禁止riscv压缩代码?

assembly - 在 RISC-V 上在大端和小端之间转换

caching - RISC-V Rocket 缓存一致性

linux - 为什么linux系统调用跨架构不同

riscv - 初始化堆栈指针

c - 如何制作一个简单的多核多线程裸机程序?

riscv - 如何在 Chisel 中做出断言只是警告而不是停止模拟

assembly - 什么可能导致 RISC-V 上的 SIGILL(非法指令除外)?