lh
lyszt.net behandelt lh und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
lh lädt ein Halbwort aus dem Speicher. Ein Byte besteht aus 8 Bits und hat seine eigene Adresse, was es zur kleinsten adressierbaren Einheit macht. Ein Wort besteht aus 4 Bytes, also 32 Bits, und ein Halbwort ist die Hälfte davon: 2 Bytes, also 16 Bits. lh liest 16 Bits, während lw 32 liest. Die Adressierung entspricht der von lw: ein Basisregister plus ein konstanter Offset (siehe die lw-Seite). Die Form erscheint unten.
lh rd, offset(rs1)
Ein Register enthält 32 Bits, also muss ein 16-Bit-Ladevorgang die verbleibenden 16 Bits füllen. lh verwendet Vorzeichenerweiterung. Es liest das höchste Bit des 16-Bit-Werts, das das Vorzeichen einer vorzeichenbehafteten Zahl markiert, und kopiert dieses Bit in alle 16 oberen Bits des Registers. Der Wert behält sein Vorzeichen, sodass eine 16-Bit--3 als 32-Bit--3 ankommt.
Verwenden Sie lh für vorzeichenbehaftete 16-Bit-Daten, wie Audio-Samples oder Sensorwerte, die negativ werden können. Sein Partner lhu, mit u für unsigned, füllt die oberen Bits mit 0en, was für Daten geeignet ist, die nie negativ werden. Das Bitmuster 0x8000 wird mit lh geladen zu -32768, und mit lhu geladen zu +32768. Die Bits im Speicher bleiben gleich, und der Ladevorgang entscheidet über die Bedeutung.
Das RISC-V-Handbuch definiert lh als das Laden eines 16-Bit-Werts aus dem Speicher und dessen Vorzeichenerweiterung auf 32 Bits, bevor er in rd gespeichert wird. Die effektive Adresse ist das Register rs1 plus der vorzeichenerweiterten 12-Bit-Offset. Ein Zugriff ist natürlich ausgerichtet, wenn seine Adresse durch die Größe des Zugriffs in Bytes teilbar ist, also ist ein Halbwort-Zugriff an geraden Adressen ausgerichtet.
Halbwörter sind 2 Bytes, also liegen Arrays davon an den Offsets 0, 2, 4, und ein Zeiger bewegt sich durch sie, indem er 2 addiert.
Beispiel
.data val: .half -5 .text la t0, val lh t1, 0(t0) # t1 = -5 (sign-extended)
