бути повернуто в B, причому в точку, наступну за викликом C. При завершенні B управління повинне повертатися в A, в точку, наступну за викликом B. Правильну послідовність повернень легко забезпечити, якщо при кожному виклику процедури записувати адресу повернення в стек. Так, коли процедура A викликає процедуру B, в стек заноситься адреса повернення в A; коли B викликає C, в стек заноситься адреса повернення в B. Коли C закінчується, адреса повернення вибирається з вершини стека - а це адреса повернення в B. Коли закінчується B, у вершині стека знаходиться адресу повернення в A, і повернення з B відбудеться в A.
Механізм виклику функції або процедури в мові високого рівня істотно залежить від архітектури комп'ютера і операційної системи. У рамках IBM PC сумісних комп'ютерів, в мікропроцесорах сімейства Intel, як і в більшості сучасних процесорних архітектур, підтримується апаратний стек. Апаратний стек розташований в ОЗУ, покажчик стека міститься в парі спеціальних регістрів SS: SP доступних для програміста. Апаратний стек розширюється в бік зменшення адрес, покажчик його адресує перший вільний елемент. Виконання команд CALL і INT, а також апаратних переривань включає в себе запис в апаратний стек адреси повернення. Як передані в процедуру або функцію фактичні параметри, так і які повертаються з них значення поміщаються в апаратний стек спеціальними командами процесора. Додатково зберігаються значення необхідних регістрів. Схематично цей механізм ілюстрований на малюнку 1.
Виконання команд RET і IRET включає в себе вибірку з апаратного стека адреси повернення і передачу управління за цією адресою. Пара команд - PUSH і POP - Забезпечує використання апаратного стека для програмного вирішення інших завдань.
Системи програмування для блочно-орієнтованих мов (PASCAL, C, C + + та ін) використовують стек для розміщення в ньому локальних змінних процедур і інших програмних блоків. Стек розбитий на фрагменти, які становлять блоки послідовних осередків. Кожен виклик підпрограми використовує фрагмент стека, довжина якого залежить від викликає підпрограми. При кожній активізації процедури пам'ять для її локальних змінних виділяється в стеку; при завершенні процедури ця пам'ять звільняється. Оскільки при викликах процедур завжди строго
В
малюнок 1
дотримується вкладеність, то в вершині стека завжди знаходиться пам'ять, що містить локальні змінні активною в даний момент процедури.
Таким чином, у загальному випадку при виклику процедурою A процедури B відбувається наступне:
1. У вершину стека поміщається фрагмент потрібного розміру. У нього входять наступні, дані: (А) покажчики фактичних параметрів виклику процедури В; (б) порожні клітинки для локальних змінних, визначених у процедурі В; (в) адреса повернення, тобто адресу команди у процедурі A, яку слід виконати після того, як процедура B закінчить свою роботу.
Якщо B - функція, то у ф...