sh

sh

Assembly RISC-V Riferimento

lyszt.net tratta sh 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

sh scrive una halfword, 16 bit o 2 byte, in memoria. Corrisponde ai caricamenti lh e lhu e memorizza la dimensione più stretta dove sw memorizza la parola completa. La forma è mostrata di seguito. Prende il valore nel registro sorgente rs2 e scrive i suoi 16 bit più bassi all'indirizzo nel registro di base rs1 più l'offset. Il layout corrisponde a sw, con il registro sorgente nominato per primo.

sh rs2, offset(rs1)

Un registro contiene 32 bit e solo 16 vengono memorizzati, quindi sh mantiene i 16 bit più bassi e scarta i 16 bit superiori. Le memorizzazioni non hanno scelta con o senza segno. Questa scelta appartiene ai caricamenti, dove un valore stretto deve essere esteso per riempire un registro e i bit mancanti necessitano di una regola. Una memorizzazione restringe il valore, e mantenere i bit bassi è l'unico comportamento che abbia senso. Se il registro contiene un valore troppo grande per 16 bit, i bit extra vengono persi senza avviso, quindi controlla l'intervallo prima di memorizzare.

Il manuale RISC-V dice che sh memorizza i 16 bit bassi del registro rs2 in memoria all'indirizzo di rs1 più l'offset di 12 bit esteso con segno. Le memorizzazioni di halfword a indirizzi pari sono naturalmente allineate e non sollevano mai un errore di allineamento. Una memorizzazione a un indirizzo che non è naturalmente allineato si comporta come definisce l'ambiente di esecuzione, e il manuale dice che può essere estremamente lenta.

sh scrive ogni formato a 16 bit che lh e lhu rileggono, come campioni audio, dati pixel a 16 bit e array di halfword. Un modello comune è leggere, modificare e scrivere. Carica una halfword con lhu, regolala nel registro e memorizzala di nuovo con sh. Solo i 2 byte interessati cambiano e i byte circostanti rimangono come erano. Le halfword distano 2 byte, quindi i cicli spostano l'indirizzo di 2.

Esempio

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5