lui
lyszt.net behandelt lui und andere RISC-V-Befehle ausführlicher.
Kodierungsformat
Beschreibung
lui setzt große Konstanten zusammen. Eine RISC-V-Instruktion belegt 32 Bits, und diese Bits tragen die Operation, ihre Register und jede Konstante. Eine normale Instruktion kann etwa 12 Bits einer Konstante aufnehmen, was kleine Zahlen abdeckt, aber für einen vollständigen 32-Bit-Wert nicht ausreicht. Mehrere Instruktionen liefern die Teile einer großen Konstante.
lui (load upper immediate) liefert den oberen Teil. Es nimmt eine 20-Bit-Konstante und schreibt sie in die oberen 20 Bits des Zielregisters, wobei die unteren 12 Bits auf null bleiben. Die Form erscheint unten.
lui rd, value
Eine vollständige Konstante benötigt zwei Instruktionen. lui setzt die oberen 20 Bits, und addi addiert die unteren 12. Die Pseudoinstruktion li erledigt diese Arbeit für Sie, sodass ein handgeschriebenes lui für gewöhnliche Zahlen selten nötig ist.
Das RISC-V-Handbuch gibt an, dass die Assemblersyntax von lui und auipc die unteren 12 Bits der Konstante weglässt, weil diese Bits immer null sind. Es gibt außerdem an, dass ein lui, gefolgt von jalr, jede 32-Bit-Absolutadresse erreichen kann: lui lädt die oberen 20 Bits der Zieladresse und jalr addiert die unteren Bits.
lui erscheint direkt beim Laden runder Adressen, deren untere Bits null sind, wie etwa die festen Adressen von Hardwaregeräten, wo ein einzelnes lui den gesamten Wert liefert. Sein naher Verwandter ist auipc, der eine Adresse relativ zum aktuellen Ort aufbaut.
Beispiel
lui t0, 0x10 # t0 = 0x10000 (0x10 << 12)
