Instructieset en assembly

Wat is de gebruikelijke methode in RISC-V om een 32-bits constante die niet in een immediate van 12 bits past (bijvoorbeeld 0x12345678) in een register te plaatsen?

  1. AEén keer addi gebruiken en de 32-bits immediate rechtstreeks schrijven
  2. BMet lui de bovenste 20 bits instellen en met addi de onderste 12 bits optellen
  3. CConstanten kunnen niet worden gebruikt en moeten altijd uit invoer worden gelezen
Antwoord en toelichting tonen

Antwoord: B. Met lui de bovenste 20 bits instellen en met addi de onderste 12 bits optellen

lui (load upper immediate) plaatst een immediate van 20 bits in de bits 31 tot 12 van het register en maakt de onderste 12 bits 0. Als daarna met addi de onderste 12 bits worden opgeteld, kan elke 32-bits constante worden gemaakt. Als in assembleertaal „li a0, 0x12345678” wordt geschreven, breidt de assembler dit zo nodig uit tot deze twee instructies. Bij ISA's met vaste instructielengte is het gebruikelijk grote constanten in delen te maken.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Instructieset en assembly

  1. Wat is de juiste combinatie om in RISC-V de constante 0x12345FFF met de twee instructies lui en addi te maken?
  2. Welke werking van de RISC-V-instructie auipc (add upper immediate to PC) is juist?
  3. Welke 32-bits waarde staat in t0 nadat in RISC-V (RV32I) „addi t0, zero, -1” is uitgevoerd?
  4. In het geheugen staat in één byte 0x80. Welke combinatie van waarden is juist als dit byte met de RISC-V-instructies lb en lbu in een 32-bits register wordt gelezen?
  5. Welk verschil tussen RISC-V en x86 in de werking van voorwaardelijke sprongen is juist?