Wat is Stackframe?

Gebied dat bij elke functieaanroep op de stack wordt gereserveerd. Bevat het terugkeeradres, opgeslagen registers, lokale variabelen en dergelijke en wordt bij het terugkeren uit de functie vrijgegeven.

Japanse benaming: スタックフレーム

“Stackframe” komt voor in 5 oefenvragen uit 3 onderwerpen, bijv. Instructieset en assembly, Compilers, Linker, loader en uitvoerbare formaten.

Vakgebied: Instructieset en assembly

Nu oefenen: vragen over Stackframe

Bij functies die geen andere functies aanroepen (bladfuncties, leaf functions) hoeft ra vaak niet op de stack te worden opgeslagen. Wat is de juiste reden?

  1. ABladfuncties gebruiken geen ret-instructie
  2. BDe CPU plaatst het terugkeeradres van een bladfunctie automatisch op de stack
  3. COmdat ze geen andere functies aanroepen, wordt ra niet overschreven en blijft het terugkeeradres behouden
Antwoord en toelichting tonen

Antwoord: C. Omdat ze geen andere functies aanroepen, wordt ra niet overschreven en blijft het terugkeeradres behouden

ra wordt bij elke jal die een functie aanroept overschreven, dus een functie die andere functies aanroept moet zijn eigen terugkeeradres eerst op de stack opslaan. Een bladfunctie gebruikt geen jal, dus ra blijft intact en kan zonder opslaan met ret terugkeren. Als ook geen callee-saved-registers worden gebruikt, hoeft zelfs geen stackframe te worden gemaakt. De call-instructie van x86 plaatst het terugkeeradres altijd op de stack, wat hier een verschil met RISC-V is.

Wat is het juiste doel van het uitvoeren van „addi sp, sp, -16” aan het begin van een RISC-V-functie?

  1. ADe stack naar lagere adressen laten groeien en een werkgebied van 16 bytes reserveren
  2. B16 bytes op de stack vrijgeven
  3. C16 aftrekken van de waarde in sp en dat als retourwaarde teruggeven
Antwoord en toelichting tonen

Antwoord: A. De stack naar lagere adressen laten groeien en een werkgebied van 16 bytes reserveren

Volgens de conventie van veel ISA's, waaronder RISC-V, groeit de stack van hoge naar lage adressen. Als sp met 16 wordt verlaagd, vormen de 16 bytes van de nieuwe sp tot de oude sp het stackframe van deze functie, waarin het terugkeeradres, opgeslagen registers en lokale variabelen kunnen staan. Aan het eind van de functie wordt met „addi sp, sp, 16” sp teruggezet, waardoor het gebied wordt vrijgegeven en de toestand gelijk is aan die vóór de aanroep.

“Stackframe” in de toelichting

Vragen met “Stackframe” (5)

  1. Bij functies die geen andere functies aanroepen (bladfuncties, leaf functions) hoeft ra vaak niet op de stack te worden opgeslagen. Wat is de juiste reden?
  2. Wat is het juiste doel van het uitvoeren van „addi sp, sp, -16” aan het begin van een RISC-V-functie?
  3. De bovenstaande code is het begin (prologue) van een functie. Wat doet dit deel?
  4. Welk effect heeft het toepassen van tail call optimization op de laatste recursieve aanroep van de bovenstaande functie?
  5. Waar wordt tijdens uitvoering een in een C-functie gedeclareerde lokale variabele (automatische variabele) zonder static geplaatst?

Vergelijkingen met deze term

Verwante termen

Bladfunctie (leaf function) Instructiesetarchitectuur (ISA) Numerieke apertuur (NA) Stackpointer Aanroepconventie (calling convention) ABI (application binary interface) Adresseringsmodus Assembler Branch delay slot Callee-saved register

Naar de woordenlijst