Hoppa till innehållet

Anropsstack

Från Wikipedia
(Omdirigerad från Stackpekare)

Anropsstack är en datastruktur som används för att spara tillståndet i exekverandet av en procedur vid övergången till att exekvera en annan procedur, så att det blir möjligt att senare gå tillbaka och fortsätta exekverandet av den första proceduren. Anropsstacken fungerar ungefär som en hög papperslappar staplade på varandra, där CPU:n kommer åt endast den översta lappen.

Funktionsanrop

[redigera | redigera wikitext]

Många programspråk använder stacken för att skicka in data till funktioner. Detta görs genom att mikroprocessorn tillhandahåller en stackpekare i form av ett register samt primitiver för att lägga data på stacken (push) och hämta ned dem igen (pop). Först lägger man upp argumenten på stacken och sedan anropar man funktionen. Vid funktionsanropet lagrar mikroprocessorn själv undan ett par register som den måste "komma ihåg" efter att funktionsanropet är klart, till exempel varifrån i programmet den kom, så att den vet var den skall fortsätta. Den har också ofta stöd för att hålla reda på hur många variabler som finns i funktionen för dessa är ofta förlagda på stacken om det inte funnits tillräckligt med register i mikroprocessorn lediga.

Eftersom stacken är ett minnesutrymme som är optimerat för det program som för närvarande körs så byter de flesta mikroprocessorer till en separat stack när ett avbrott sker. På så sätt riskerar man inte att minnet tar slut under avbrottet.

Stackpekaren är ett register i CPUn, som innehåller minnesadressen för den minnescell där det översta elementet i anropsstacken finns. Man säger att registret 'pekar' på det översta elementet.

I moderna datorarkitekturer används stackpekaren främst för att ange ett område där värden som är aktuella för den för tillfället exekverande subrutinen lagras. Det kan röra sig om innehållet i processorregister som det anropande programmet förväntar sig vara orörda, eller returadressen dit subrutinen hoppar när den når en 'retur'-instruktion.

Stacken används även i några processorarkitekturer för att överföra parametrar från ett anropande program till en funktion eller subrutin. Den anropade subrutinen kan då enkelt komma åt parametrarna genom att läsa den minnescell som stackpekaren pekar på. När subrutinen/funktionen körts klart, minskas stackpekaren så att den inte längre pekar på parametrarna. På detta sätt kan parametrar staplas på varandra utan att de krockar. Detta i sin tur är en förutsättning för att ett program ska kunna anropa funktioner och subrutiner i valfri ordning utan att problem uppstår. Notera att i andra processorarkitekturer föredrar man dock att överföra parametrar i bestämda register istället, eftersom det är mycket långsammare att läsa och skriva värdena i primärminnet.