Материал: 0303_Болкунов_ВО_ЛР5

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Сам обработчик прерываний

intHandler proc far

Загрузка обработчика прерывания

loadInt proc near

Выгрузка обработчика, восстановление предыдущего обработчика и освобождение занятой обработчиком памяти:

unloadInt proc near

Сравнение текущего обработчика с устанавливаемым:

compareInt proc near

Сборка

Загрузочный модуль собирается из файла int.asm с помощью утилит

“masm”, “link” и “exe2bin”, для автоматизации сборки написан скрипт build.bat.

1. Резидентный обработчик прерываний

Пример работы обработчика прерывания клавиатуры показан на рисунке

1, список блоков памяти – на рисунке 2.

Рисунок 1: работа обработчика

6

Рисунок 2: список блоков MCB

Как можно заметить, счётчик обновляется при нажатии нужной клавиши.

В списке блоков видно, что программа с обработчиком всё ещё находится в памяти в блоке №6 по адресу 0544h (блоком выше, по адресу 050Eh находится копия среды, переданная программе).

2. Определение установленного обработчика

Если попробовать запустить программу с ещё активным обработчиком, об этом будет выведено оповещение (рис. 3)

7

Рисунок 3: обработчик установлен

3. Выгрузка обработчика

При запуске программы с ключом ‘/un’ активный обработчик будет выгружен (рис. 4), и обработка нажатий клавиш прекратится, при этом если обработчик не активен, будет выдано соответствующее оповещение (рис. 4).

Рисунок 4: выгрузка обработчика

При этом память занимаемая обработчиком и его копией среды будет освобождена, что видно на рисунке 5.

8

Рисунок 5: MCB список после выгрузки обработчика

Выводы:

В ходе лабораторной работы были исследованы инструменты построения пользовательских обработчиков прерываний и их сопряжение со стандартными,

написан и отлажен программный модуль с функциями загрузки и выгрузки резидентного обработчика, обрабатывающего нажатия клавиш клавиатуры,

который в свою очередь может вызывает стандартный обработчик данного прерывания.

9

Контрольные вопросы

1) Какого типа прерывания использовались в работе?

- только программные:

09h – прерывания нажатия клавиатуры

10h – прерывание видео-сервиса BIOS

16h – прерывание сервиса клавиатуры BIOS

21h – прерывание ядра DOS.

2) Чем отличается скан код от кода ASCII?

- скан-код – уникальный код клавиши клавиатуры, который напрямую подаётся в порт 60h для чтения.

ASCII же является кодовой таблицей символов.

Множества скан-кодов и ASCII символов пересекаются (например буквы и цифры) но не равны, так как есть символы/клавиши присутствующие только в одном множестве, но не в другом.

10