Курсовая работа: Програма Txtprintcom - резидентна програма для швидкого і зручного друкування виборчого тексту
and byte ptr cs:DOS_busy,0feh ; скинути признак
; зайнятості.
popf
ret 2
Int_21h_vect dd ?
Dos_busy db 0
Int_21h ENDP
Запит на виконання функції 0AH не передається одразу до операційної системи. Замість цього периодично перевіряється стан буфера вводу (функція DOS 0BH або функція 01H преривання 16H). І вже тільки після того як буфер почав заповниватися, визивається функція 0AH. Оберніть увагу на те, як оформлен возврат у програму - це викликано тим, що DOS використовує прапорець CF в якості признаку помилки.
Важливо те, що в описаному прикладі можна відмовитись від перевірки недокументованого прапорця активністі DOS. Замість того диспетчер встановлює свій власний прапорець, який дотого ж бітовий, отже він може бути об`єднан з іншими прапорцями резидентної програми.
Диспетчер функцій DOS - приємлимий, але не найбільш вдалий спосіб перевагання нереєнтабільності DOS. Програмам, використовуючим його, далеко не завжди вдається стартувати. Крім того, їм приходиться аналогічним чином відслежувати ще й преривання 25H (читати сектор), 26H (писати сектор) DOS, а також преривання 13HBIOS.
Обробники преривань 25Hі26Hвиявляються звичайними функціями - під час повернення управління вони залишають в стеці регистр прапорців. А це класичний приклад помилки, якій в наслідок увішов у документацію.
Найбільш цікавими можливостями преодоління нереєнтабільністі DOS пов`язані з використовуванням недокументованого преривання 28H. Це преривання використовується резидентними процесами самої операційної системи, наприклад, PRINT, та генерується як раз під час виконання функцій DOS, коли прапорець активністі DOS взведений, але система знаходиться у безпечному стані.
За допомогою преривання 28H можна досягнути потрясаючих результатів. Отже, така програма може стартувати, наприклад, під час копіювання файлів, а іноді при форматуванні диску.
При натисканні на «гарячу» клавишу не відбувається негайна активізація програми, а лише встановлюється битовий прапорець, повідомляючий, що поступила команда стартувати. Обробник преривання 28H перевіряє стан прапорця, і, якщо прапорець встановлен, а програма ще не активна, активізує її. На прикінці роботи управління завжди передається завжди повинне передаватись початковому обробнику. Програми, які виконуються усередині преривання 28H, не повинні користуватись функціями DOS з номерами 00H - 0CH.
А як буть, коли довгий час не відбувається звертання до функцій DOS і, отже, не вироблялось преривання 28H? ПроРграма знов не в змозі стартувать. Щоб запобігнути цього, буде потрібна ще одна точка входу, в якісті якої зручно буде обрати обробник якогось часто возникаючого преривання, наприклад, від таймеру. Тоді перед активізацією програми треба перевіряти прапорець активністі DOS, чи свій власний прапорець.
Реакція на виключні випадки.
Іноді в результаті збоїв апаратної частини або неправильних дій користувача може скластися ситуація, коли подальша робота програми виявляється неможливою. В цьому випадку управління дістає спеціальна процедура обробки критичної помилки, адреса якої знаходиться у векторі преривання 24H. Користувач може також сам прервати програму, натиснувши комбинацію клавиш Ctrl+Break. При цьому MS-DOS передає управління до процедури завершення, яка починається по адресі обробника преривання 23H.
Цей сервіс DOS, неодмінно, дуже корисний, але орієнтован на звичайні програми і не може правильно працювати в резидентних програмах. Тому вам слід передбачити власну оброботку виключних випадків або відключити існуючу.
Почнемо з преривання Ctrl+Break. Реакція системи на це преривання залежить від стану прапорця перевірки по Ctrl+Break. Якщо прапорець скинутий, то перевірка натиснення Ctrl+Break і завершення програми відбувається тільки при виконанні функції DOS з номерами 00H - 0CH, а якщо прапорець встановлен, при виконанні будь-яких функцій. Тому, якщо в програмі не використовуються функції DOS 00H-0CH, тоді достатньо скинути прапорець перевірки по Ctrl+Break при активізації резидентної програми і встановити його початкове значення перед поверненням у пасивний стан.
Функція 33H. Прапорець перевірки по Ctrl+Break
Виклик: AH = 33H
AL = 0 - отримати стан прапорця
1 - змінити стан прапорця.
DL(якщо AL=1) = 0 - скинути прапорець
1 - встановити прапорець
Повертає: DL ( якщо ALдорівнював 0) -
стан прапорця:
0 - скинут
1 - встановлен