Funktionsprolog og epilog - Function prologue and epilogue
Ved programmering af samlingssprog er funktionsprologen et par kodelinjer i begyndelsen af en funktion, som forbereder stakken og registrerer til brug inden for funktionen. På samme måde vises funktionsepilogen i slutningen af funktionen og gendanner stakken og registre til den tilstand, de var i, før funktionen blev kaldt.
Prologen og epilogen er ikke en del af selve samlingssproget; de repræsenterer en konvention, der anvendes ved samling sproglige programmører , og compilere mange højere niveau sprog . De er ret stive og har den samme form i hver funktion.
Funktionsprolog og epilog indeholder også undertiden kode til bufferoverløbsbeskyttelse .
Prolog
En funktionsprolog udfører typisk følgende handlinger, hvis arkitekturen har en basismarkør (også kendt som rammemarkør) og en stakmarkør:
- Skubber den nuværende basispeger på stakken, så den kan gendannes senere.
- Tildeler værdien af basispegeren til adressen på stakpegeren (som er peget mod toppen af stakken), så basismarkøren peger mod toppen af stakken.
- Flytter stabelmarkøren yderligere ved at reducere eller øge dens værdi, afhængigt af om stakken vokser ned eller op. På x86 reduceres stabelmarkøren for at give plads til funktionens lokale variabler.
Flere mulige prologer kan skrives, hvilket resulterer i en lidt anden stakkonfiguration. Disse forskelle er acceptable, så længe programmereren eller kompilatoren bruger stakken på den korrekte måde inde i funktionen.
Som et eksempel er her en typisk x86 -samlingssprogfunktionsprolog som fremstillet af GCC
push ebp
mov ebp, esp
sub esp, N
Den umiddelbare værdi N er antallet af bytes, der er reserveret på stakken til lokal brug.
Det samme resultat kan opnås ved at bruge enterinstruktionen:
enter N, 0
Mere komplekse prologer kan opnås ved hjælp af forskellige værdier (andre end 0) for enterinstruktionens anden operand . Disse prologer skubber flere basis-/rammepunkter for at muliggøre indlejrede funktioner , som kræves af sprog som Pascal . Moderne versioner af disse sprog bruger imidlertid ikke disse instruktioner, fordi de i nogle tilfælde begrænser rededybden.
Epilog
Funktionsepilog vender funktionsprologens handlinger tilbage og returnerer kontrollen til den kaldende funktion. Det udfører typisk følgende handlinger (denne procedure kan variere fra en arkitektur til en anden):
- Drop stakemarkøren til den nuværende basismarkør, så der er fri plads i prologen til lokale variabler.
- Hopper basismarkøren af stakken, så den gendannes til sin værdi før prologen.
- Vender tilbage til opkaldsfunktionen ved at skubbe den forrige rammes programtæller ud af stakken og hoppe til den.
Den givne epilog vil vende virkningerne af en af de ovenstående prologer (enten den fulde eller den, der bruger enter). Under visse kaldekonventioner er det calleens ansvar at rense argumenterne fra stakken, så epilogen kan også omfatte trinnet med at flytte stabelmarkøren ned eller op.
Disse tre trin kan f.eks. Udføres i 32-bit x86-montagesprog ved hjælp af følgende instruktioner:
mov esp, ebp
pop ebp
ret
Ligesom prologen indeholder x86- processoren en indbygget instruktion, der udfører en del af epilogen. Følgende kode svarer til ovenstående kode:
leave
ret
Den leaveinstruktion udfører movog popinstruktioner, som beskrevet ovenfor.
En funktion kan indeholde flere epiloger. Hvert funktionsudgangspunkt skal enten hoppe til en fælles epilog i slutningen eller indeholde sin egen epilog. Derfor bruger programmerere eller kompilatorer ofte kombinationen af leaveog rettil at forlade funktionen når som helst. (For eksempel ville en C -kompilator erstatte en returnsætning med en leave/ retsekvens).
Yderligere læsning
- de Boyne Pollard, Jonathan (2010). "Genen om funktionsbegrænsninger" . Ofte givet svar .