sw
lyszt.net aborda sw e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
sw pega um valor de um registrador e o escreve na memória, o oposto de lw. O nome significa store word (armazenar palavra), e uma palavra tem 32 bits. Os carregamentos movem dados da memória para os registradores para que possam ser processados, e os armazenamentos enviam os resultados de volta. As duas instruções compõem o ciclo de carregar, calcular e armazenar do RISC-V, porque a aritmética acontece apenas nos registradores.
A sintaxe de sw aparece abaixo. A ordem dos operandos difere da maioria das instruções.
sw rs2, offset(rs1)
rs2 contém o valor a ser escrito. O segundo operando, offset(rs1), fornece o endereço de destino na memória: o endereço no registrador base rs1 mais um pequeno deslocamento constante, o mesmo endereçamento que lw usa. A linha abaixo escreve o valor em t1 no endereço contido em t0.
sw t1, 0(t0)
sw deixa todos os registradores inalterados. Seu efeito recai inteiramente sobre a memória, enquanto quase todas as outras instruções escrevem em um registrador.
O manual do RISC-V afirma que sw, sh e sb armazenam valores de 32 bits, 16 bits e 8 bits dos bits baixos do registrador rs2 na memória. O endereço efetivo é o registrador rs1 mais o deslocamento de 12 bits estendido com sinal. Carregamentos e armazenamentos em endereços naturalmente alinhados nunca geram erro de alinhamento, e o manual garante que eles são executados atomicamente, como um único passo indivisível.
Os armazenamentos salvam resultados em arrays e variáveis, e uma função os usa para colocar valores em seu espaço de rascunho na pilha. Um armazenamento sobrescreve todos os 4 bytes no endereço de destino. O exemplo escreve 99 em um local rotulado na memória, substituindo o que estava lá. A memória mantém esse valor até que outro armazenamento o sobrescreva, ao contrário de um registrador.
Exemplo
la t0, slot li t1, 99 sw t1, 0(t0) # memory at slot now holds 99
