Instructieset en assembly

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?

  1. Ara wordt door de binnenste aanroep overschreven en de buitenste functie kan niet meer correct naar de juiste aanroeper terugkeren
  2. BDe CPU slaat ra automatisch op, dus er treedt geen probleem op
  3. CHet rekenresultaat wordt verdubbeld, ongeacht de recursiediepte
Antwoord en toelichting tonen

Antwoord: A. ra wordt door de binnenste aanroep overschreven en de buitenste functie kan niet meer correct naar de juiste aanroeper terugkeren

De jal van een recursieve aanroep overschrijft ra met „de instructie na de aanroep binnen de functie zelf”. Als dat niet is opgeslagen, keert de buitenste functie bij ret niet terug naar de oorspronkelijke aanroeper maar in zichzelf, waardoor dezelfde plaats herhaaldelijk wordt doorlopen of een storing optreedt. Daarom is afgesproken dat een functie die andere functies aanroept in de prologue ra op de stack opslaat en in de epiloog terugzet.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Instructieset en assembly

  1. 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?
  2. 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)?
  3. 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)?
  4. a0 bevat het beginadres van een array a van het type int (4 bytes) en a1 bevat de index i. Wat leest de bovenstaande code in a2?
  5. Welke uitspraak is juist over de methode waarbij rekeninstructies waarden in het geheugen rechtstreeks kunnen gebruiken, zoals de x86-instructie „add eax, [rbx]”?