lbu
lyszt.net behandelt lbu und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
lbu liest ein Byte (8 Bits) aus dem Speicher als vorzeichenlosen Wert. Es bildet ein Paar mit lb, und die beiden unterscheiden sich nur darin, wie sie den Rest des Registers füllen. Beide lesen ein Byte mit derselben Adressierung. Die Seite lb behandelt Bytes und die Adressierungsform. Die Form von lbu erscheint unten.
lbu rd, offset(rs1)
Ein Register hält 32 Bits, also bleiben bei einem 1-Byte-Ladevorgang 24 Bits zum Füllen übrig. lb kopiert das höchste Bit des Bytes in diese Bits, was Vorzeichenerweiterung ist und eine negative Zahl erzeugen kann. lbu füllt sie mit 0en, sodass das Ergebnis immer zwischen 0 und 255 liegt. Das u steht für die vorzeichenlose Lesart.
Textladevorgänge verwenden normalerweise lbu. Zeichencodes sind vorzeichenlos, und bei vielen ist das höchste Bit gesetzt, darunter akzentuierte Buchstaben und verschiedene Symbole. Das vorzeichenerweiternde lb macht sie negativ und bricht Vergleiche. Die Standard-Textschleife verwendet lbu. Sie lädt ein Byte, prüft, ob es null ist, was das Ende des Textes markiert, verarbeitet es und addiert 1 zur Adresse.
Das RISC-V-Handbuch definiert lb und lbu als die 8-Bit-Versionen der Halbwort-Ladevorgänge, mit derselben effektiven Adresse aus Register rs1 plus dem vorzeichenerweiterten 12-Bit-Offset. Der Speicher ist byte-adressiert, also benennt jede Adresse ein Byte.
lbu eignet sich auch für andere Byte-Daten, darunter Farbkanäle in Bildern, Rohdatenpuffer und Instruktionsbytes in einem Interpreter. Auf diese Weise geladene Bytes haben kein Vorzeichen zu behandeln, sodass sie sich direkt mit Verschiebungen und ORs kombinieren lassen, wenn ein größerer Wert aus einzelnen Bytes rekonstruiert wird. Verwende lb nur, wenn die 8-Bit-Daten vorzeichenbehaftet sind.
Beispiel
.data val: .byte 0xff .text la t0, val lbu t1, 0(t0) # t1 = 255 (zero-extended)
