csrrw
lyszt.net 更详细地介绍了 csrrw 和其他 RISC-V 指令。
描述
csrrw 将一个控制寄存器与一个通用寄存器交换。控制和状态寄存器(CSR)是一种特殊寄存器,用于保存处理器状态,包括陷阱处理程序地址以及中断是否启用。CSR 有一个 12 位编号,通常还有一个类似 mtvec 的名称。只有 CSR 指令可以访问 CSR,而 lw 或 sw 不能。该名称代表 atomic read and write CSR。Atomic 意味着读取和写入作为单个不可分割的步骤发生。
csrrw rd, csr, rs1
CSR 的旧值被写入 rd,rs1 的值被写入 CSR。下面这行将 t0 中的地址存入 mtvec,并将之前的 mtvec 值留在 t1 中。
csrrw t1, mtvec, t0
如果 rd 是 zero,则旧值被丢弃,且不读取 CSR。这种形式是 csrw 简写。如果 rs1 是 zero,则 CSR 被 0 覆盖。
此模拟器提供六个 CSR:mstatus、mie、mtvec、mepc、mcause 和 mip。对 mip 的写入会被忽略,因为硬件会设置它。任何其他 CSR 编号读取为 0,并忽略写入。读取请参见 csrr,更改单个位请参见 csrs 和 csrc。
RISC-V 手册指出,当 rd=x0 时,csrrw 不读取 CSR,而当 rs1=x0 时,csrrw 尝试向其写入零。
示例
li t0, 0x100 csrrw t1, mtvec, t0 # mtvec = 0x100, t1 = old mtvec
