lh

lh

RISC-V Assembler Referenz

lyszt.net behandelt lh und andere RISC-V-Befehle ausführlicher.

Kodierungsformat

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

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)