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?

  1. Aaddi wird einmal verwendet und das 32-Bit-Immediate direkt geschrieben
  2. BMit lui werden die oberen 20 Bit gesetzt und mit addi die unteren 12 Bit addiert
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Befehlssatz und Assembler

  1. Welche Kombination ist richtig, wenn bei RISC-V die Konstante 0x12345FFF mit den zwei Befehlen lui und addi erzeugt wird?
  2. Welche Wirkung hat der RISC-V-Befehl auipc (add upper immediate to PC)?
  3. Welchen 32-Bit-Wert enthält t0 nach Ausführung von „addi t0, zero, -1“ in RISC-V (RV32I)?
  4. Im Speicher steht in einem Byte der Wert 0x80. Welche Kombination von Werten ist richtig, wenn dieses Byte mit den RISC-V-Befehlen lb und lbu in ein 32-Bit-Register geladen wird?
  5. Welcher Unterschied zwischen RISC-V und x86 beim Mechanismus bedingter Verzweigungen ist richtig?