li
Pseudoelementlyszt.net behandelt li und andere RISC-V-Befehle ausführlicher.
Beschreibung
li lädt eine konstante Zahl in ein Register. Der Name steht für load immediate (sofort laden), und ein Immediate ist ein fester Wert, der direkt im Code geschrieben wird. Die nächste Zeile speichert 42 in t0.
li t0, 42
Die meisten Programme beginnen damit, bekannte Zahlen in Register zu legen, darunter Zähler, Grenzwerte und Dienstcodes.
Das Wort load stammt von einer Hardware-Grenze. Eine RISC-V-Instruktion ist 32 Bit lang und muss die Operation, die Register und die Konstante zusammen tragen. Eine Instruktion kann keine vollständige 32-Bit-Konstante aufnehmen. Kleine Konstanten passen hinein und große nicht.
li umgeht diese Grenze. Es ist eine Pseudoinstruktion, ein Name, den der Assembler durch die tatsächlichen Instruktionen ersetzt, die der Wert erfordert. Ein kleiner Wert benötigt eine Instruktion. Ein großer Wert benötigt zwei, eine, die den oberen Teil setzt, und eine, die den unteren Teil hinzufügt, sodass die nächste Zeile für eine Zahl beliebiger Größe funktioniert.
li t1, 0x10010000
Der Simulator zeigt die tatsächlichen Instruktionen an, in die li expandiert.
Das RISC-V-Handbuch beschreibt lui als die Instruktion zum Aufbau von 32-Bit-Konstanten. Sie platziert einen 20-Bit-Wert in den oberen Bits des Zielregisters und füllt die niedrigsten 12 Bits mit Nullen.
li und la laden unterschiedliche Dinge. li lädt eine Zahl, die Sie eingegeben haben, und la lädt die Adresse, für die ein Label steht. Das Beispiel lädt einen kleinen und einen großen Wert, und der Assembler behandelt beide auf dieselbe Weise.
Wird erweitert zu
addi rd, zero, imm # small constants lui rd, hi + addi rd, rd, lo # large constants
Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).
Beispiel
li t0, 42 li t1, 0x10010000
