я незміненою, тому що в процедурі змінювалася лише його копія; y - змінює своє значення, тому що в процедуру був переданий його адресу і зміни проводилися за цією адресою).
Для передачі в підпрограму великих структур даних (наприклад, масивів) слід застосовувати передачу за посиланням, т.к. це дозволить заощадити пам'ять.
Механізм роботи підпрограм
Використання апаратного стека.
Для моделювання семантики (логіки побудови) блокової структури програми в ПВЕМ в даний час використовується механізм - стек. Стеком називається наступна структура даних, яка організована за принципом LIEO (останній пішов - першим прийшов). p align="justify"> Стек заповняться наступним чином: перший елемент кладеться на дно стека, другий - по верх першого ...
Елемент, занесений до апаратний стек останнім - верхівка стека.
Витяг відбувається в зворотному порядку: спочатку витягується елемент з верхівки стека, а за ним усі інші. Вилучити елемент з середини стека неможливо. p align="justify"> Програми ПВЕМ будуються за сегментному принципом. p align="justify"> Сегмент - ділянка пам'яті розміром 64 Кбайт, адреса будь-якої комірки дорівнює адресою комірки + адреса зсуву. p align="justify"> Сегменти бувають трьох типів:
В· (CS) коду - є завжди;
В· (DS або ES) зайнятий - якщо осередок зайнята даними;
В· (SS) стека - якщо використовується процес або константа (параметр, змінні, адреса повернення).
При запуску програми в оперативній пам'яті автоматично утворюється стек, який займає один сегмент. Стек застосовується для роботи з підпрограмами. В архітектурі сучасних комп'ютерів існує апаратний стек. Основою його служить регістр покажчика стека SR. SR містить адресу того елемента, який був занесений в стек останнім, за традицією при записі елементів у стек, значення регістра SR зменшується. Таким чином, стек росте в бік зменшення адрес. p align="justify"> При виклику підпрограми в апаратний стек заносяться:
В· Фактичні параметри (у тім порядку, у якому вони вказані);
В· Адреса повернення;
В· Блок локальних змінних.
Занесення в стек відбувається саме в такому порядку.
Приклад:
, y: integer; Two (p1, p2);, z: integer; Three (p);, a: integer;
Two (z, p); [@ M4]; Four;, a: integer;
Three (y); [@ M3]; (Two)
Four [@ M2]; Batton1. Click (...)
Two (x, y); (@ M1);
End.
По завершенні роботи програми походить витяг з апаратного стека в зворотному порядку.
Покажчики
Покажчики та динамічна пам'ять.
Всі змінні оголошені в програмі розміщуються в межах безперервної області оперативної пам'яті, яка називається сегмент даних (1 сегмент дорівнює 64 Кбайт). При обробці великих обсягів даних всі змінні можуть не поміститися в один сегмент. Для використання пам'яті знаходиться поза сегмента пам'яті, використовується механізм динамічної пам'яті. Динамічної вважається все оперативна пам'ять за вирахуванням сегменту даних, сегмента стека і сегмента з кодом програми. Пам'ять називається динамічною, тому що вона виділяється безпосередньо в процесі роботи програми. Пам'ять, розташована в сегменті даних - статична і виділяється на етапі компіляції програми. p align="justify"> Динамічна пам'ять заснована на роботі з адресами. При динамічному виділенні пам'яті, заздалегідь не відомо: чи не тип, не кількість розміщуваних даних. У динамічної пам'яті не можна звертатися по іменах, а лише за адресами. br/>
Адреси та вказівники
Операційна пам'ять являє собою сукупність елементарних комірок для зберігання інформації. Кожна комірка може зберігати один байт інформації і володіє унікальним номером, який називається адресою. p align="justify"> Покажчик - змінна, яка в якості свого значення містить адресу байта пам'яті:
p: pointer; [@]
У ПЕОМ адреси задаються сукупністю двох шістнадцяткових слів:
. перше слово - сегмент;
. друге слов...