Stiva de apeluri

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 12 martie 2018; verificările necesită 3 modificări .

stiva de apeluri _ _  _ _ _ _ _ _ _ apeluri) și/sau pentru a reveni la program de la un handler de întreruperi (inclusiv la schimbarea sarcinilor într-un mediu multitasking ).

Când o subrutină este apelată sau apare o întrerupere , adresa de retur este introdusă pe stivă  - adresa din memoria următoarei instrucțiuni a programului suspendat, iar controlul este transferat subrutinei sau handler-ului subrutinei. Cu un apel ulterior imbricat sau recursiv, întreruperea unei subrutine sau a unui handler de întreruperi, următoarea adresă de retur este împinsă în stivă etc.

La întoarcerea de la o subrutină sau un handler de întrerupere, adresa de retur este scoasă din stivă și controlul este transferat la următoarea instrucțiune a (sub-)programului suspendat.

Implementare

Stiva de apeluri este de obicei implementată într-unul dintre următoarele moduri:

Dacă nu există nicio stivă sau adâncimea sa este limitată, apelurile imbricate sunt excluse sau numărul lor este limitat. Dacă este nevoie de mai multe imbricare, stiva de apeluri sau extensia sa pot fi implementate programatic.

Suport

Apelurile de subrutine și returnările de la subrutine și de la manipulatorii de întreruperi sunt efectuate de obicei prin instrucțiuni specializate ale procesorului. Pe lângă instrucțiunile de apel și returnare, procesoarele au adesea instrucțiuni pentru utilizarea stivei de apeluri și pentru salvarea datelor - punerea lor pe stivă, scoaterea lor din stivă, modificarea conținutului stivei.

Instrucțiunile de apelare, returnare și stiva pot diferi în ceea ce privește dimensiunea datelor stocate (în acest caz, trebuie să utilizați instrucțiunile corespunzătoare sau echivalentele acestora).

Uneori, procedurile de returnare dintr-o subrutină și un handler de întrerupere diferă unele de altele și necesită, de asemenea, instrucțiuni diferite (de exemplu, la întoarcerea dintr-o întrerupere, este adesea necesar să scoateți registrul de semnalizare din stivă și/sau să activați procesarea întreruperi concurente, care pot fi dezactivate automat când este apelat handler-ul).

În absența instrucțiunilor specializate (în procesoarele cu un set de instrucțiuni redus), apelurile, returnările și alte lucrări cu stiva de apeluri sunt implementate prin instrucțiunile obișnuite pentru lucrul cu memorie / registre și transferul de control.

Utilizare

Stiva de apeluri poate fi folosită pentru o varietate de scopuri, dar scopul său principal este să țină evidența unde ar trebui să revină fiecare dintre procedurile apelate după ce s-a finalizat. Pentru a face acest lucru, atunci când o procedură este apelată (prin instrucțiuni de apelare), adresa instrucțiunii care urmează instrucțiunii de apelare („adresa de retur”) este împinsă în stivă. La finalizare, procedura apelată trebuie să emită o instrucțiune de returnare pentru a sări la adresa din stivă.

Pe lângă adresele de returnare, pe stivă pot fi stocate și alte date, de exemplu:

Utilizarea stivei în sisteme multitasking

În sistemele multitasking , fiecare sarcină are de obicei propria sa stivă, iar atunci când o sarcină este comutată, indicatorul de stivă al procesorului este mutat la ea.

Utilizare non-standard

Stiva poate fi folosită nestandard, de exemplu:

Utilizări alternative

Într-o utilizare alternativă, indicatorul stivei este mutat în zona de date și instrucțiunile stivei sunt folosite ca operații cu șir pentru a procesa date secvențiale în memorie.

În utilizarea alternativă, procesarea întreruperilor nu este posibilă, deoarece întreruperile trebuie dezactivate pentru a evita coruperea datelor.

Note

Vezi și

Note

  1. Registru - adresă - retur - Marea Enciclopedie a Petrolului și Gazelor, articol . Preluat la 13 ianuarie 2016. Arhivat din original la 16 august 2016.