lh
lyszt.net tratta lh e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
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)
