[小知识]总结CSRs寄存器的读写指令

在之前的文章中介绍scr1时,对CPU IPIC register操作指令是有限制的,只能用csrrw/csrrwi。那这堆指令到底什么区别呢

https://blog.csdn.net/kuankuan02/article/details/91489378

 

针对CSRs操作指令,我们来重新梳理一下。

首先明确,真正的机器码只有6条指令:

[小知识]总结CSRs寄存器的读写指令_第1张图片

[小知识]总结CSRs寄存器的读写指令_第2张图片

csrrw (CSR read and write) ,这是读写操作,csr中的值写入rd,rs1的值写入csr。

csrrwi是csrrw的立即数扩展,rs1寄存器保存值变为一个立即数,对csr的操作是一致的。

csrrs(CSR read and set), 这是读并置位操作,csr中的值写入rd, rs1的值或上(or)csr中的值再写入csr。

csrrsi是csrrs的立即数扩展,rs1寄存器保存值变为一个立即数,对csr的操作是一致的。

csrrc(CSR read and clear),这是读并清除操作,csr中的值读入rd,根据rs1的值对csr中的值按位清0 再写入csr中。

csrrci是csrrc的立即数扩展,rs1寄存器保存值变为一个立即数,对csr的操作是一致的。

各种资料中其他的csr指令均是伪指令,我们举例gnu中的伪指令:

csrr rd,csr 读一个csr中的值到rd中,相当于

csrrw rd,csr,zero

csrw csr ,rs1 写rs1寄存器的值到csr中,相当于

csrrw zero,csr,rs1

csrc csr, rs1 根据rs1中的值按位对csr的值清0,相当于

csrrc zero,csr,rs1

csrs csr, rs1 根据rs1的值按位对csr的值置1,相当于

csrrs zero,csr,rs1

以 i 结尾的伪指令,都是立即数指令,用立即数替换了rs1,操作是一致的。

总结起来很简单:

1,想对csr连读带写,可选用基础的6条csr指令直接搞定;

2,仅仅是读的话,哪条基础指令都可以,一般会用伪指令;

3,以 i 结尾的,不管是基础指令还是伪指令,都是立即数作为参数的,在指令中操作这个立即数替换了 rs1

4,csr基础的操作,就简单的3种区别,w (直接写 ), s(设置) , c(清除),不计i的4字母指令都是伪指令;

5,http://crva.ict.ac.cn/documents/RISC-V-Reader-Chinese-v2p1.pdf  ,上csr指令有些名字错误,主要看内容描述

6,伪指令仅仅是方便程序员读写代码,最终编译器还是都给转成了基础指令。

你可能感兴趣的:(gnu,risc-v)