sw

sw

Assembly RISC-V Riferimento

lyszt.net tratta sw e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

sw prende un valore da un registro e lo scrive in memoria, l'opposto di lw. Il nome sta per store word (memorizza parola), e una parola è di 32 bit. I caricamenti spostano i dati dalla memoria ai registri in modo che possano essere elaborati, e i salvataggi rimandano indietro i risultati. Le due istruzioni costituiscono il ciclo carica, calcola e salva di RISC-V, perché l'aritmetica avviene solo nei registri.

La sintassi di sw è mostrata di seguito. L'ordine degli operandi differisce dalla maggior parte delle istruzioni.

sw rs2, offset(rs1)

rs2 contiene il valore da scrivere. Il secondo operando, offset(rs1), fornisce l'indirizzo di destinazione in memoria: l'indirizzo nel registro di base rs1 più un piccolo offset costante, lo stesso indirizzamento usato da lw. La riga seguente scrive il valore in t1 all'indirizzo contenuto in t0.

sw t1, 0(t0)

sw lascia ogni registro invariato. Il suo effetto ricade interamente sulla memoria, mentre quasi tutte le altre istruzioni scrivono in un registro.

Il manuale RISC-V afferma che sw, sh e sb memorizzano valori a 32 bit, 16 bit e 8 bit dai bit bassi del registro rs2 alla memoria. L'indirizzo effettivo è il registro rs1 più l'offset di 12 bit esteso con segno. I caricamenti e i salvataggi a indirizzi allineati naturalmente non generano mai un errore di allineamento, e il manuale garantisce che vengano eseguiti atomicamente, come un unico passo indivisibile.

I salvataggi conservano i risultati in array e variabili, e una funzione li usa per collocare valori nel proprio spazio di lavoro sullo stack. Un salvataggio sovrascrive tutti i 4 byte all'indirizzo di destinazione. L'esempio scrive 99 in una posizione etichettata in memoria, sostituendo ciò che vi era. La memoria conserva quel valore finché un altro salvataggio non lo sovrascrive, a differenza di un registro.

Esempio

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99