Sunteți pe pagina 1din 4

STIVA

Definiţie: Din punct de vedere informaţional stiva este o colecţie de date ce sunt plasate în locaţii
succesive de memorie sau într-o reuniune de registre, prevăzute cu mecanisme specifice de acces.

Definiţie: Din punct de vedere structural stiva este o reuniune de registre dotate cu un mecanism
specific de acces printr-un punct de acces, care se numeşte vârful stivei.

Definiţie: Din punct de vedere structural stiva este o porţiune de memorie la care accesul se face printr-
o locaţie unică, numită vârful stivei.

Definiţie: Din punct de vedere al structurilor de date stiva este o listă de tip LIFO (Last In First Out), adică
ultimul intrat este primul accesat.

Se disting două categorii de stive:


a) Stive hardware - definite pe grupuri de registre;
b) Stive software – definite în memoria calculatorului.

Definiţie: Numărul de elemente dintr-o stivă reprezintă lungimea stivei. Asupra oricărei stive se pot
defini două operaţii:
1) Introducerea (inserarea) de noi elemente în stivă sau operaţia de scriere în stivă, numită PUSH;
2) Extragerea (eliminarea) elementelor din stivă sau operaţia de citire din stivă, numită POP.

Definiţie: Prin vârful stivei se înţelege ultimul registru sau ultima locaţie de memorie cu care s-a operat,
deci vârful stivei este mobil.
Evidenţa vârfului stivei se realizează cu un contor de stivă sau un numărător de stivă notat SP
(Stack Pointer). Întotdeauna valoarea SP reprezintă adresa vârfului stivei. După fiecare operaţie PUSH
sau POP se modifică SP. Dimensiunea SP depinde de dimensiunea stivei. Dacă SP are n biţi, atunci
mărimea stivei este de 2n elemente. Orice operaţie cu stiva are loc numai prin vârful stivei. De aceea se
spune că vârful stivei este mobil.
Orice stivă are o bază (de unde începe umplerea) şi un palier superior numit plafon, care nu
reprezintă vârful stivei. Siva prezintă o porţiune ocupată (de la bază până la vârful stivei inclusiv) şi o
porţiune liberă (de la vârful stivei exclusiv, până la plafon). Stiva prezintă doi indicatori de stare, aceştia
indicând starea de plin, respectiv starea de gol a unei stive.

Definiţie: Se numeşte stare de plin momentul în care toate elementele stivei sunt pline sau ocupate.
Definiţie: Se numeşte stare de gol momentul în care s-a extras şi ultimul element din stivă, aflat în bază.

LUCRUL CU SUBRUTINE
O subrutină (sau, în general, se mai numeşte şi procedură) este o secvenţă de instrucţiuni
apelată într-un punct al alteia, executată, după care are loc revenirea în secvenţa de instrucţiuni
apelantă, la instrucţiunea imediat următoare celei care a determinat sau în timpul căreia s-a făcut
apelarea.
Mai general, execuţia unui program cu subrutine, implică comutarea contextului de lucru.
Contextul de lucru, respectiv „starea” programului este definit de valorile luate de variabilele sale la un
moment dat, iar, în particular, de conţinutul registrelor microprocesorului şi ale indicatorilor de condiţii.
Valoarea curentă a PC reprezintă minimul de context al unui program care trebuie salvat la începutul
subrutinei şi restabilit la sfârşitul ei. După necesităţi, în cadrul subrutinei, prin software, se pot face şi
alte salvări.
În acest scop UComandă trebuie să execute cel puţin următoarele acţiuni:
a) Salvarea conţinutului curent al PC (care va constitui adresa de revenire);
b) Încărcarea PC cu adresa de salt (adresa primei instrucţiuni din subrutină).
Subrutina se încheie cu o instrucţiune de salt prin care se reîncarcă PC cu adresa de revenire în
programul apelant. Execuţia unei subrutine poate fi iniţiată în două moduri:
1. Din interiorul microprocesorului (de exemplu, în cazul când o secvenţă de instrucţiuni trebuie
executată de mai multe ori, în diferite puncte ale unui program de bază. În loc ca această
secvenţă de instrucţiuni să fie scrisă în toate punctele programului în care este executată, se
constituie o subrutină, care este apelată prin instrucţiuni specifice (CALL), ori de câte ori este
nevoie).
2. Din exteriorul microprocesorului (de exemplu, la apariţia unei cereri de întrerupere (se va relua)
a activităţii UCP, primită de la un dispozitiv extern, microprocesorul sistează execuţia secvenţei
curente şi trece la execuţia unei alte secvenţe, reprezentând un subprogram pentru servirea
perifericului care a solicitat întreruperea).
Pentru satisfacerea specificaţiilor funcţionale definite anterior este nevoie de:
- O arie de memorie numită STIVĂ pentru păstrarea (salvarea) contextului de lucru după fiecare
apel al unei subrutine;
- Un numărător de stivă (SP=Stack Pointer=indicator de stivă), care să reţină adresa vârfului
stivei.
OBSERVAŢIE: - SP este decrementat cu 1 când se introduc date în stivă cu instrucţiunea PUSH, şi
decrementat cu 2 când sunt salvate în stivă adresele de revenire la apelarea subrutinelor cu
instrucţiunile CALL şi GOTO sau la acceptarea unei întreruperi.
- SP este incrementat cu 1 când datele sunt citite din stivă cu instrucţiunea POP, şi
incrementat cu 2 când sunt citite din stivă adrese la execuţia unei instrucţiuni de revenire dintr-o
subrutină (RET) sau dintr-o întrerupere (RETI).

Memoria stivă (pe scurt stiva) este o arie de memorie RAM (sau un set de registre interne la unele
microprocesoare) utilizată pe principiul LIFO (Last In-First Out=Ultimul intrat-Primul ieşit). Mecanismul
normal de lucru cu stiva este următorul:
- La adăugarea unui element (unei date) în stivă se face prin plasarea sa în vârful stivei, adică
stiva creşte;
- La scoaterea unui element se face tot din vârful stivei, adică stiva descreşte.
Concluzie: Rezultă că ordinea de scoatere din stivă a elementelor este inversă în raport cu ordinea de
depunere în stivă.
Acest mod de lucru se realizează prin faptul că SP indică întotdeauna vârful stivei. Valoarea
iniţială a lui SP se numeşte adresă de bază şi, de regulă, se fixează la iniţializarea sistemului. De obicei
stiva creşte spre adrese mai mici, acest lucru nefiind însă obligatoriu.
Transferul datelor între UCP şi stivă (în cazul în care stiva este organizată în exteriorul
microprocesorului) se face în două moduri:
- automat de către UC la întreruperea unui program prin încărcarea în vârful stivei a dresei de revenire
(valoarea curentă a PC);
- prin instrucţiuni speciale de transfer cu stiva. Încărcarea sau extragerea unei date în/din vârful stivei
determină actualizarea SP (decrementarea/incrementarea).
CONCLUZIE: Stiva este o structură de date în care introducerea (extragerea) de elemente se poate
efectua doar într-o (dintr-o) singură poziţie, numită vârful stivei, care este de fapt, sfârşitul listei. Stivele
sunt cunoscute de asemenea ca liste LIFO (Last In First Out).

Operaţiile fundamentale care se pot efectua asupra unei stive sunt: introducerea în stivă (PUSH) şi
extragerea din stivă (POP) a celui mai recent element introdus. De asemenea, acest element poate fi
accesat printr-o operaţie care nu presupune şi extragerea sa din stivă (TOP=accesarea primului
element). Operaţiile POP şi TOP asupra unei stive vide sunt considerate erori.

POP PUSH
STIVA
TOP
Figura 1 Modelul stivei. Introducerea, extragerea şi accesarea primului element

Modelul general al stivei este acela în care doar un singur element este accesibil (acela care se află în
vârful stivei).

VÂRF
C
VÂRF VÂRF
B B B
A A A

Figura 2 Modelul stivei. Accesibilitatea elementului din vârf după operaţiile PUSH şi POP

Implementarea stivelor
Stivele pot fi implementate în două moduri clasice: static şi dinamic. Implementarea dinamică
utilizează pointeri, iar cea statică, tablouri. Implementarea sub formă de tablou are dezavantajul lungimii
finite a stivei.
Operaţiile care pot fi efectuate asupra unei stive sunt următoarele:
• crearea stivei;
• introducerea unui element în stivă;
• extragerea unui element din stivă;
• extragerea informaţiei elementului aflat în vârful stivei;
• testul de stivă vidă.

A. Implementarea dinamică
Implementarea dinamică utilizează modelul listei înlănţuite. O operaţie de tip PUSH realizează
introducerea unui element în capul listei, iar o operaţie de tip POP determină eliminarea elementului din
capul listei. O operaţie de tip TOP va accesa elementul din capul listei şi va întoarce informaţia conţinută
de acesta.
Crearea unei stive constă în iniţializarea vârfului stivei cu valoarea NULL. Introducerea
elementului următor se va realiza prin:
- alocarea unui spaţiu în memorie pentru acesta şi
- atribuirea valorii din vârful stivei câmpului care indică spre elementul următor. Apoi, se va actualiza
vârful stivei.
B. Implementarea statică
O alternativă la implementarea stivelor cu pointeri este implementarea cu tablouri.
Dezavantajul acestei metode constă în declararea apriorică a dimensiunii maxime a stivei.

Aplicaţiile stivelor

Structurile de tip stivă au aplicaţii în domeniul sistemelor de calcul, la apelul subrutinelor, în


calculul recursiv, sau în evaluarea unor expresii.
Dimensiunea memoriei stivă determină numărul nivelelor de subprograme ce pot fi conţinute
într-un program de bază. De exemplu, pentru un microprocesor cu adresele reprezentate prin cuvinte
(adică pe 16 biţi=2 octeţi) şi memoria organizată pe locaţii de memorie de 1 octet, cu o memorie stivă de
100 locaţii, pot fi executate programe cu maxim 50 nivele de subprograme (maxim 50 subrutine
conţinute una în cealaltă), când stiva este organizată în exteriorul microprocesorului. Când stiva este
organizată în interiorul microprocesorului, într-o arie de memorie RAM sau într-un set special de
registre, numărul de nivele este limitat faţă de situaţia în care stiva este externă.
OBESRVAŢIE: În lucrul cu stiva NU este necesară manevrarea explicită de adrese ale datelor din ea.
Mecanismul LIFO, dacă este respectat şi de către program, asigură salvarea şi restabilirea corectă a
contextului de lucru.

Într-un program principal poate fi apelată o subrutină S1, care la rândul său poate
apela o subrutină S2. Pentru revenire în subrutina S1, după execuţia subrutinei S2, trebuie
ca adresa următoarei instrucţiuni din S1 (Adr2) să fie disponibilă. În mod identic, la revenirea din
subrutina S1, este necesară cunoaşterea adresei de revenire în programul principal (Adr1).
Program principal
. CALL
. S1
. . CALL
. S2
Apel S1
Adr1 Apel S2 .

. Adr2 .

. . .

. Sfârşit S2
. RET
Sfârşit Program Principal Sfârşit S1
RET

Figura 3 Secvenţa apelurilor de subrutine


Pentru ca adresele să fie cunoscute, trebuie memorată mai întâi Adr1, iar apoi Adr2. Deci este
necesară memorarea într-o structură de tip stivă.
INIŢIAL CALL S1 CALL S2 RET S1 RET S2

Adr2

Adr1 Adr1 Adr1

Figura 4 Memorarea adreselor de revenire în cazul apelurilor de subrutine (unde „ ” reprezintă vârful stivei)

S-ar putea să vă placă și