З М І С Т
1. Структура резидентних програм............................................................................................................................ 3
2. Обробка переривань від клавіатури............................................................................................................................ 6
3. Обробка переривань від клавіатури з підключенням після системного обробника.................................................................................................................... 12
1.Структура резидентних програм.
Великий клас програм, які забезпечують функціонування обчислювальної системи (драйвери пристроїв, оболонки DOS, програми шифрації і захисту даних, русифікатори, обслуговуючі програми типу електронних блокнотів або калькуляторів і ін.), повинні постійно знаходитися в пам'яті і миттєво реагувати на запити користувача або на якісь події, що відбуваються в обчислювальній системі. Такі програми носять назви програм, резидентних в пам'яті (Terminate and Stay Resident, TSR), або просто резидентних програм. Зробити резидентною можна як програму типу .СОМ, так і програму типу .ЕХЕ, проте з огляду на те, що резидентна програма повинна бути максимально компактною, найчастіше як резидентних використовують програми типу .СОМ.
Розглянемо типову структуру резидентної програми і системні засоби залишення її в пам'яті після початкової ініціалізації:
text segment 'code'
assume CS:text,OS:text
org lOOh main proc
jmp init ;Переход на секцию инициализации
;Данные резидентной секции программы
entry: ;Текст резидентной секции программы
main endp
Init proc ;Секция инициализации
mov OX,(init-ma1n+lOFh)/16 ;Размер в параграфах
mov АН.3100h , ;Функция "завершить и оставить в
int 21h ;памяти"
init endp text ends
end main
Програма пишеться у форматі .СОМ, тому в ній передбачається тільки один сегмент, в якому зв'язуються сегментні регістри CS і DS; на початку сегменту резервується lOOh байт для PSP.
При запуску програми з клавіатури управління передається (відповідно до параметра директиви end) на початку процедури main. Командою jmp відразу ж здійснюється перехід на секцію ініціалізації, яка може бути оформлена у вигляді окремої процедури або входити до складу процедури main. У секції ініціалізації, зокрема, готуються умови для подальшої активізації програми вже в резидентному стані. Останніми рядками секції ініціалізації викликається функція DOS 31h, яка виконує завершення програми із залишенням в пам'яті вказаної її частини. Розмір резидентної частини програми (у параграфах) передається цій функції DOS в регістрі DX. Визначити розмір резидентної секції можна, наприклад, таким чином. До різниці зсувів init-main, яка рівна довжині резидентної частини програми в байтах, додається розмір PSP (l00h) і ще число 15 (Fh) для того, щоб після цілочисельного ділення на 16 результат був округлений в більшу сторону.
З метою економії пам'яті секція ініціалізації розташовується в кінці програми і відкидається при її завершенні.
Функція 31h, закріпивши за резидентною програмою необхідну для її функціонування пам'ять, передає управління командному процесору COMMAND.COM, і обчислювальна система переходить, таким чином, в початковий стан.
Наявність програми, резидентної в пам'яті, ніяк не відображається на ході обчислювального процесу, за винятком того, що зменшується об'єм вільної пам'яті. Одночасно може бути завантажене будь-яке число резидентних програм.
На мал. 47.2 показані елементи резидентної програми і їх взаємодія.
Будь-яка резидентна програма має принаймні дві точки входу. При запуску з клавіатури програми типу .СОМ управління завжди передається на перший байт після PSP, тобто на самий початок програми. Тому практично завжди першою командою резидентної програми є команда jmp, яка передає управління на почало секції ініціалізації.
Після відробітку функції DOS 31h програми залишається в пам'яті в пасивному стані. Для того, щоб активізувати резидентну програму, їй треба якось передати управління і, можливо, параметри. Викликати до життя резидентну програму можна різними способами, але найбільш споживаним є механізм апаратних або програмних переривань. В цьому випадку в секції ініціалізації необхідно заповнити відповідний вектор адресою резидентної частини програми (точка entry на мал. 47.2). Адреса entry утворює другу точку входу в програму, через яку здійснюється її активізація. Очевидно, що резидентна секція програми повинна закінчуватися командою виходу з переривання iret.
2. Обробка переривань від клавіатури.
Практично будь-яка програма, в якій передбачене управління ходом її виконання за допомогою команд, що подаються з клавіатури, має в своєму складі обробник переривань від клавіатури. Залежно від тих, що стоять перед ним завдань, обробник може підключатися до системного, виконуючи обробку скан-кодів клавіш, що натискаються, або після системного, працюючи в цьому випадку з кодами ASCII, що виникають на виході системного обробника. Нерідкі випадки, коли прикладний обробник виконує частину своїх функцій до системного, а частина - після.
Для того, щоб написати обробник переривань від клавіатури, необхідно добре представляти, яким чином вводяться, куди потрапляють і як обробляються символи, що вводяться з клавіатури. Процес взаємодії системи з клавіатурою показаний на мал. 51.1.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.