Instructieset en assembly

De bovenstaande code is het begin (prologue) van een functie. Wat doet dit deel?

addi sp, sp, -16
sw   ra, 12(sp)
sw   s0, 8(sp)
  1. AHet reserveert ruimte op de stack en slaat het terugkeeradres (ra) en het callee-saved s0 op
  2. BHet leest de functieargumenten ra en s0 van de stack
  3. CHet geeft de stack vrij om uit de functie terug te keren
Antwoord en toelichting tonen

Antwoord: A. Het reserveert ruimte op de stack en slaat het terugkeeradres (ra) en het callee-saved s0 op

Regel 1 verlaagt sp met 16 om het stackframe te reserveren, regel 2 schrijft het terugkeeradres ra en regel 3 het callee-saved s0 in het frame. Deze functie roept andere functies aan en moet dus ra bewaren, en gebruikt s0 en moet dus de oorspronkelijke waarde beschermen. In de epiloog aan het eind van de functie wordt in omgekeerde volgorde teruggekeerd met „lw s0, 8(sp)”, „lw ra, 12(sp)”, „addi sp, sp, 16” en „ret”.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Instructieset en assembly

  1. Welk voordeel heeft het gebruik van de frame pointer (in RISC-V s0/fp) in een functie?
  2. Wat gebeurt er als men bij het schrijven van een recursieve functie die zichzelf aanroept in RISC-V vergeet ra op de stack op te slaan?
  3. Op een little-endian RISC-V is het register met 0x12345678 met „sw” naar adres 0x100 geschreven. Wat is de waarde als daarna met „lbu” het byte op adres 0x101 wordt gelezen?
  4. Wat kan er gebeuren als het adres van een lw-instructie die 4 bytes leest in RISC-V geen veelvoud van 4 is (niet uitgelijnd)?
  5. Met welke factor van de waarde van a0 is het resultaat t0 van de RISC-V-instructie „slli t0, a0, 3” te vergelijken (overloop buiten beschouwing gelaten)?