lb
lyszt.net behandelt lb und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
lb liest ein Byte aus dem Speicher, was die kleinste Einheit ist, die ein Ladevorgang abrufen kann. Der Speicher besteht aus Bytes, jedes Byte hat 8 Bits, und eine Adresse identifiziert ein Byte. lw liest 4 Bytes, lh liest 2, und lb liest 1. Es verwendet dieselbe Adressierung wie die anderen Ladebefehle: ein Basisregister plus einen Offset (siehe die lw-Seite). Die Form ist unten dargestellt.
lb rd, offset(rs1)
Ein Register enthält 32 Bits und ein Byte enthält 8, also benötigen die oberen 24 Bits einen Wert. lb führt eine Vorzeichenerweiterung durch: Es kopiert das oberste Bit des Bytes in alle oberen Bits und behält den Wert als vorzeichenbehaftete Zahl bei. Ein Byte mit dem Wert -5 kommt als 32-Bit-Wert -5 an.
Die Wahl zwischen vorzeichenbehaftet und vorzeichenlos ist am wichtigsten für Text, die häufigste Byte-Datenart, weil Zeichencodes vorzeichenlos sind. Viele Zeichencodes haben ihr oberstes Bit gesetzt. Lädt man einen davon mit dem vorzeichenerweiternden lb, entsteht eine negative Zahl, und Vergleiche mit gewöhnlichen positiven Zeichencodes schlagen dann fehl. Verwenden Sie lbu, load byte unsigned, für Text; es füllt die oberen Bits mit 0en. Verwenden Sie lb für vorzeichenbehaftete Daten, wie kleine Offsets, die positiv oder negativ sein können.
Das RISC-V-Handbuch definiert lb und lbu als die 8-Bit-Versionen der Halbwort-Ladebefehle, mit derselben effektiven Adresse aus Register rs1 plus dem vorzeichenerweiterten 12-Bit-Offset. Der Speicher ist byte-adressiert, also identifiziert eine Adresse ein Byte.
Bytes liegen eine Adresse auseinander, also bewegt sich eine Schleife durch ein Byte-Array, indem sie 1 zur Adresse addiert. Eine typische Schleife liest ein Byte, prüft, ob es null ist (die Markierung für das Ende des Textes), verarbeitet es und erhöht die Adresse um 1.
Beispiel
.data val: .byte -5 .text la t0, val lb t1, 0(t0) # t1 = -5 (sign-extended)
