Befehlssatz und Assembler
Wie wird bei RISC-V üblicherweise eine 32-Bit-Konstante (z. B. 0x12345678), die nicht in ein 12-Bit-Immediate passt, in ein Register geladen?
- Aaddi wird einmal verwendet und das 32-Bit-Immediate direkt geschrieben
- BMit lui werden die oberen 20 Bit gesetzt und mit addi die unteren 12 Bit addiert
- CKonstanten sind nicht verwendbar und müssen stets von der Eingabe gelesen werden
Antwort und Erläuterung anzeigen
Antwort: B. Mit lui werden die oberen 20 Bit gesetzt und mit addi die unteren 12 Bit addiert
lui (load upper immediate) legt ein 20-Bit-Immediate auf die Bits 31 bis 12 des Registers und setzt die unteren 12 Bit auf 0. Addiert man anschließend mit addi die unteren 12 Bit, entsteht eine beliebige 32-Bit-Konstante. Schreibt man im Assembler „li a0, 0x12345678“, expandiert der Assembler bei Bedarf in diese beiden Befehle. Bei ISAs mit fester Befehlslänge ist es üblich, große Konstanten in Teilen zu erzeugen.