lhu
lyszt.net behandelt lhu und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
lhu liest ein Halbwort (16 Bits oder 2 Bytes) aus dem Speicher und behandelt es als vorzeichenlos. Es bildet ein Paar mit lh, und die beiden unterscheiden sich darin, wie sie die obere Hälfte des Zielregisters füllen. Beide lesen 16 Bits mit derselben Adressierung. Halbwörter und die Adressierungsform werden auf der lh-Seite behandelt. Die Form von lhu ist unten dargestellt.
lhu rd, offset(rs1)
Ein Register enthält 32 Bits, also muss ein 16-Bit-Ladevorgang die oberen 16 füllen. lh kopiert das Vorzeichenbit darüber, was negative Zahlen negativ hält. lhu füllt sie mit 0en, was Nullerweiterung genannt wird, sodass das Ergebnis immer nicht negativ ist, von 0 bis 65535. Das u im Namen kennzeichnet die vorzeichenlose Lesart.
Die Daten entscheiden, welche verwendet wird. Wähle lh für Werte, die negativ sein können, und lhu für Werte, die nie negativ sind. Das Bitmuster 0xFFFF, mit lhu geladen, ist 65535, und dieselben Bits, mit lh geladen, sind -1.
Das RISC-V-Handbuch definiert lhu als das Laden eines 16-Bit-Werts aus dem Speicher und dessen Nullerweiterung auf 32 Bits, bevor er in rd gespeichert wird. Die effektive Adresse ist das Register rs1 plus der vorzeichenerweiterten 12-Bit-Offset.
Die meisten 16-Bit-Daten sind vorzeichenlos. Zeichencodes in einigen Textkodierungen, Portnummern und Prüfsummen in Netzwerkdaten, 16-Bit-Pixelformate und Längenfelder in Dateiformaten sind Beispiele. Die Vorzeichenerweiterung würde für jeden davon einen falschen Wert ergeben, sobald das oberste Bit gesetzt ist, also ist lhu der richtige Ladevorgang. Halbwörter liegen 2 Bytes auseinander, also verschieben Schleifen über sie die Adresse um 2.
Beispiel
.data val: .half 0xffff .text la t0, val lhu t1, 0(t0) # t1 = 65535 (zero-extended)
