lhu

lhu

Assembly RISC-V Riferimento

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

lhu legge una mezza parola (16 bit, o 2 byte) dalla memoria e la tratta come senza segno. Fa coppia con lh, e i due differiscono nel modo in cui riempiono la metà superiore del registro di destinazione. Entrambi leggono 16 bit con lo stesso indirizzamento. Le mezze parole e la forma di indirizzamento sono trattate nella pagina lh. La forma di lhu è mostrata di seguito.

lhu rd, offset(rs1)

Un registro contiene 32 bit, quindi un caricamento a 16 bit deve riempire i 16 superiori. lh copia il bit di segno su di essi, il che mantiene negativi i numeri negativi. lhu li riempie con 0, chiamata estensione a zero, quindi il risultato è sempre non negativo, da 0 a 65535. La u nel nome indica la lettura senza segno.

I dati decidono quale usare. Scegli lh per valori che possono essere negativi e lhu per valori che non sono mai negativi. Il pattern di bit 0xFFFF caricato con lhu è 65535, e gli stessi bit caricati con lh sono -1.

Il manuale RISC-V definisce lhu come il caricamento di un valore a 16 bit dalla memoria e la sua estensione a zero a 32 bit prima di memorizzarlo in rd. L'indirizzo effettivo è il registro rs1 più l'offset a 12 bit esteso in segno.

La maggior parte dei dati a 16 bit è senza segno. Codici di caratteri in alcune codifiche di testo, numeri di porta e checksum nei dati di rete, formati di pixel a 16 bit e campi di lunghezza nei formati di file ne sono esempi. L'estensione del segno darebbe un valore errato per ognuno di essi una volta impostato il bit superiore, quindi lhu è il caricamento giusto. Le mezze parole distano 2 byte, quindi i cicli su di esse spostano l'indirizzo di 2.

Esempio

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)