Розрізняють завершення програм з передачею коду повернення в MS-DOS та без нього, резидентне та нерезидентне, а також нормальне та аварійне. При завершенні програм MS-DOS виконує:
1) закриття всіх відкритих програмою файлів;
2) звільнення пам’яті, виділеної при завантаженні програми; якщо завершення програми нерезидентне, звільняються обидва блоки пам’яті: блок середовища та блок завантажувального модуля. При резидентному завершенні блок, зайнятий програмою, залишається для MS-DOS “зайнятий”;
3) переключення PSP активної програми на PSP батька;
4) формування та збереження у внутрішній змінній байта коду повернення (якщо завершення виконується з передачею коду повернення);
5) відтворення векторів переривання 22h, 23h та 24h в значення, записані в PSP завершальної програми.
Існують декілька можливостей для завершення програми.
1. Видача переривання 20h у будь-якому місці коду програми. Програма “викидається” операційною системою. При цьому необхідно, щоб сегментний регістр CS дорівнював PID, що має місце тільки для програм в .COM-форматі. Тому загальноприйнятим є другий спосіб завершення, що реалізується при програмуванні на асемблері.
2. Виконання безумовного переходу на зміщення 0 PSP чи інструкцією безумовного переходу JMP, чи інструкцією RET FAR, якою закінчується код програми. В останньому випадку необхідно виконати деякі допоміжні дії відразу ж після завантаження програми. Отримавши керування, програма записує в стек нульове слово та поточне значення регістра DS. Так як завантажувач MS-DOS встановлює DS рівним PID, після цих операції в стеку формується far-покажчик PID:0000h на перший байт PSP. Як згадувалося раніше, перших два байти PSP утворюють машинний код інструкції INT 20h. В результаті прямої чи “допоміжної” передачі керування на перший байт PSP виконується переривання 20h і умова CS=PID виконується автоматично. Практично той же метод завершення реалізує і компілятор Сі.
3. Виконання інструкції CALL на зміщення 50h в PSP з попередньо встановленими значеннями регістрів AH = 00h чи 4Ch. По зміщенню 50h в PSP розміщується 2 байти, утворюючи код інструкції INТ 21h: CDh 21h. Таким же чином можна викликати і будь-які інші функції MS-DOS.
4. Виконання переривань 21h з AH=00h.
Способи описані в пп.1-4, не дозволяють передати код повернення в батьківську програму.
5. Виконання функції MS-DOS AH=4Ch (EXIT). Код повернення, який задається нащадком у регістрі AL, буде досяжний батьківській програмі, якщо він виконає функціональний виклик AH=4Dh (WAIT) (код повернення повертається в регістр AL).
В пп.1-5 описані способи нерезидентного завершення програми. Використовуючи лише перераховані способи, можна завершити програму, зберігаючи її резидентно в пам’яті.
6. Виконання переривання 27h (тільки для .СОМ-файлів).
7. Виконання функції AH = 31h переривання 21h.
![]() |
![]() |
![]() |