му типу СОМ, так і програму типу
ЕХЕ, однак з огляду на те, що резидентна програма повинна бути максимально компактною, найчастіше як резидентних використовують програми типу СОМ.
Розглянемо типову структуру резидентної програми та системні засоби залишення її в пам'яті після ініціалізації (рис. 2.1).
text segment 'code'
assume CS: text, DS : text
org 100h main proc
jmp init ; Перехід на секцію ініціалізації
; Дані резидентної секції програми
. . .
entry: ; Текст резидентної секції програми
. . .
main endp
init proc ; Секція ініціалізації
. . .
mov DX, (Init-main +10 Fh)/16 ; Paзмер в параграфах
mov АН, 3100h ; функція "Завершити і залишити в
int 21h ; пам'яті "init endp text ends
end main
Рис 2 .1. Типова структура резидентної програми.
Програма пишеться у форматі СОМ, тому в ній передбачається тільки один сегмент, з якому зв'язуються сегментні регістри CS і DS; на початку сегмента резервується l00h байт дня PSP.
При запуску програми з клавіатури управління передається (відповідно до параметром директиви end) на початок процедури main. Командою jmp відразу ж здійснюється перехід на секцію ініціалізації, яка може бути оформлена у вигляді окремої процедури або входити до складу процедури main. У секції ініціалізації, зокрема, готуються умови для роботи програми вже в резидентном стані. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми із залишенням в пам'яті зазначеної її частини. Ця функція не може залишати резидентними програми розміром більше 64 КБ, але багато програми, написані на асемблері, відповідають цій умові. Так як резидентні програми зменшують обсяг основної пам'яті, їх завжди пишуть на асемблері і оптимізують для досягнення мінімального розміру.
Розмір резидентної частини програми (у параграфах) передається DOS в регістрі DX. Визначити розмір резидентної секції можна, наприклад, таким обра-зом. До різниці зсувів mil-main, яка дорівнює довжині резидентної частини програми в байтах, додається розмір PSP (l00h) і ще число 15 (Fh) для того, щоб після цілочисельного ділення на 16 результат був заокруглений в більшу сторону. p> З метою економії пам'яті секція ініціалізації розташовується я кінці програми і відкидається при її завершенні.
В
Точка входу В® main
при завантаженні jmp init
. Резидентні
: ...