lh

lh

Assembly RISC-V Riferimento

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

lh carica una mezza parola dalla memoria. Un byte è composto da 8 bit e possiede il proprio indirizzo, il che lo rende la più piccola unità indirizzabile. Una parola è composta da 4 byte, ovvero 32 bit, e una mezza parola è la metà di ciò: 2 byte, ovvero 16 bit. lh legge 16 bit dove lw ne legge 32. L'indirizzamento corrisponde a quello di lw: un registro di base più un offset costante (vedi la pagina lw). La forma è mostrata di seguito.

lh rd, offset(rs1)

Un registro contiene 32 bit, quindi un caricamento a 16 bit deve riempire i 16 bit rimanenti. lh utilizza l'estensione del segno. Legge il bit più alto del valore a 16 bit, che indica il segno di un numero con segno, e copia quel bit in tutti i 16 bit superiori del registro. Il valore mantiene il proprio segno, quindi un -3 a 16 bit arriva come un -3 a 32 bit.

Usa lh per dati con segno a 16 bit, come campioni audio o letture di sensori che possono diventare negativi. Il suo partner lhu, con u per unsigned, riempie la parte superiore con 0, il che si adatta a dati che non diventano mai negativi. Il pattern di bit 0x8000 caricato con lh diventa -32768, e caricato con lhu diventa +32768. I bit in memoria rimangono gli stessi, ed è il caricamento a decidere il significato.

Il manuale RISC-V definisce lh come il caricamento di un valore a 16 bit dalla memoria e la sua estensione del segno a 32 bit prima di memorizzarlo in rd. L'indirizzo effettivo è il registro rs1 più l'offset a 12 bit esteso nel segno. Un accesso è naturalmente allineato quando il suo indirizzo è divisibile per la dimensione dell'accesso in byte, quindi un accesso a mezza parola è allineato agli indirizzi pari.

Le mezze parole sono di 2 byte, quindi gli array di esse si trovano agli offset 0, 2, 4, e un puntatore li attraversa aggiungendo 2.

Esempio

.data
val: .half -5
.text
la t0, val
lh t1, 0(t0)   # t1 = -5 (sign-extended)