CSR 指令里的 atomic 是内存原子吗?
不是。Zicsr 里的 atomic 指 CSR 读和写在同一条 CSR 指令中完成,不是对内存地址执行 AMO。
读取 CSR 旧值到 rd,并以 rs1 为位掩码原子置位 CSR;rs1=x0 时不写 CSR
CSRRS 是 Zicsr 的 CSR 原子读并置位指令:先读取 CSR 旧值并零扩展到 XLEN 写入 rd,再把 rs1 中为 1 的位作为掩码,对应置位目标 CSR。若 rs1=x0,指令不写 CSR,也不产生 CSR 写副作用;此时仍读取 CSR,除非访问本身因权限或 CSR 存在性非法。
展示 Zicsr CSR 读-改-写的 ISA 可见流程:解析 SYSTEM 编码、读取 CSR、按写/置位/清位语义计算,再更新 rd 与 CSR。
CSR 名称/地址属于指令语法;旧 CSR 值和 rs1 示例值属于执行上下文。动画不赋予示例 CSR 任何具体平台字段含义。
CSRRS 是 Zicsr 定义的 I-type SYSTEM 指令,CSR 地址位于 bits 31..20。
位级视图显示当前 XLEN 的 CSR 值计算。
该动画只展示 Zicsr 定义的 ISA 可见 CSR 读写、副作用抑制和位掩码语义;不模拟具体 CSR 字段含义、异常处理器、流水线或时序。
CSRRS 读取 CSR 旧值,并用 rs1 的 1 位作为置位掩码。rs1=x0 是只读 CSR 访问:读 CSR,但不写 CSR。
结合 «csrrs x5, mstatus, x6 # x5 = old mstatus; set bits in mstatus per x6» 等实际代码理解该场景。
结合 «csrrs x5, mstatus, x6 # x5 = old mstatus; set bits in mstatus per x6» 等实际代码理解该场景。
不是。Zicsr 里的 atomic 指 CSR 读和写在同一条 CSR 指令中完成,不是对内存地址执行 AMO。
不一样。rd=x0 只在 CSRRW/CSRRWI 中抑制 CSR 读取;rs1=x0 或 uimm=0 只在 CSRRS/CSRRC 及其立即数形式中抑制 CSR 写入。