sw

sw

Assembly RISC-V Referência

lyszt.net aborda sw e outras instruções RISC-V com mais detalhes.

Formato de codificação

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

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