csrw
pseudolyszt.net aborda csrw e outras instruções RISC-V com mais detalhes.
Descrição
csrw copia um registrador para um registrador de controle. Um registrador de controle e status, ou CSR, mantém o estado do processador, como o endereço do tratador de trap e os interruptores de interrupção (veja csrrw). A forma abaixo copia rs para o CSR e descarta o valor antigo.
csrw csr, rs
É uma pseudoinstrução, um nome legível que o montador reescreve como uma instrução real. Ela se torna a instrução abaixo, onde rd é zero para que o valor antigo não seja lido.
csrrw zero, csr, rs
O uso mais comum define o tratador de trap. As linhas abaixo colocam o endereço do rótulo handler em mtvec.
la t0, handler csrw mtvec, t0
Os dois bits menos significativos de mtvec selecionam o modo. Com 00, todo trap salta para o endereço em mtvec. Com 01, chamado de modo vetorizado, uma interrupção salta para o endereço mais 4 vezes o seu código de causa, então a interrupção do botão, código 11, cai 44 bytes após o endereço base. O próprio endereço deve ter seus dois bits menos significativos livres, pois eles contêm o modo.
O manual do RISC-V define csrw csr, rs1 como csrrw x0, csr, rs1.
Expande para
csrrw zero, csr, rs
O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.
Exemplo
li t0, 0x100 csrw mtvec, t0 # mtvec = 0x100
