Реализация многозадачности при помощи прерываний
При работе под операционной системой DOS, если и существует какой-нибудь способ, с помощью которого мы можем реализовать многозадачность, так это только использование механизма прерываний. Некоторые прерывания вырабатываются в результате внешних событий, в то время как другие евязаны с событиями внутренними. Для примера, давайте сначала рассмотрим, пожалуй самое популярное прерывание — прерывание от клавиатуры.
Всякий раз, когда происходит нажатие клавиши, ваша программа, что бы она при этом ни делала, останавливается и начинает работать процедура обслуживания прерываний клавиатуры. (Готов спорить, вы и не подозревали, что ваша программа останавливается при каждом нажатии на клавишу, однако это действительно так!) После окончания процедуры обслуживания прерывания управление снова передается вашей программе. Во время всего этого процесса ваша программа, данные и все остальное остается целым и невредимым. Для любой процедуры обслуживания прерываний это Правило Номер Один; без определенной цели ничего не должно уничтожаться. Так, например, если ваша процедура обслуживания прерывания использует для своей работы регистры процессора, вам первым делом следует сохранить содержимое этих регистров, затем осуществить обработку прерывания и снова восстановить содержимое регистров в точно таком же виде, каким оно было до прерывания.
Прежде чем мы начнем разбираться с основными принципами написания и установки обработчика прерываний, давайте взглянем, какие же прерывания есть у персонального компьютера. Посмотрите на таблицу 12.1.
Таблица 12.1. Прерывания ПК.
Номер
Адрес
Функция
0h
000-003h
Деление на ноль
1h
004-007h
Пошаговое выполнение
2h
008-00Bh
Немаскируемуе прерывание
3h
00C-00Fh
Точка останова
4h
010-013h
Переполнение
5h
014-017h
Печать содержимого экрана
6h
018-01Bh
Зарезервировано
7h
01C-01Fh
Зарезервировано
8h
020-023h
Таймер 18.2
9h
024-027h
Клавиатура
0Ah
028-02Bh
Зарезервировано
0Bh
02С-02Fh
RS-232 Порт 1
0Ch
030-033h
RS-232 Порт 0
0Dh
034-03Bh
Жесткий диск
0Eh
038-03Bh
Дискета
0Fh
03C-03Fh
Зарезервировано
10h
040-043h
Функция видеовывода
11h
044-047h
Проверка оборудования
12H
048-04ВН
Проверка памяти
13Н
04C-04FH
Функции ввода/вывода на дискету
14Н
050-053Н
Функции ввода/вывода последовательного порта
15Н
054-057Н
Функции ввода/вывода на кассетный магнитофон
16Н
058-05ВН
Функции ввода клавиатуры
17Н
05C-05FH
Функции вывода на принтер
18Н
060-063Н
Точка входа в ROM BIOS
19Н
064-067Н
Процесс загрузки
1АН
068-06ВН
Получение информации о времени
1ВН
06C-06FH
Управление прерыванием
1СН
070-073Н
Управление таймером
1DH
074-077Н
Таблица инициализации видеосистемы
1ЕН
078-07ВН
Таблица параметров дискеты
1FH
07C-07FH
Таблица графических символов
20Н
080-083Н
Завершение DOS
программы
21Н
084-087Н
Универсальные функции DOS
22Н
088-08ВН
Адрес завершения DOS
2ЗН
08C-08FH
Адрес обработчика Ctrl+Break
24Н
090-093Н
Адрес обработчика критических ошибок DOS
25Н
094-097Н
Абсолютное чтение с диска DOS
26Н
098-09ВН
Абсолютная запись на диск DOS
27H
09C-09FH
Установка резидентной программы DOS
28-3FH
0A0-0FFH
Зарезервировано для DOS
40-7FH
100-1FFH
Не используется
80-F0H
200-ЗСЗН
Зарезервировано для Бейсика
F1-FFH
3C4-3FFH
Не используется
<
Таблица 12.1 - это таблица векторов прерываний. Она занимает первые 1024 байт памяти каждого персонального компьютера. Всего в этой таблице 256 элементов, каждый из которых имеет размер 4 байта и представляет собой значение дальнего указателя на процедуру обслуживания прерывания. Как вы могли заметить, персональный компьютер не использует все 256 прерываний. Однако число задействованных прерываний постоянно растет.
Персональный компьютер поддерживает прерывания как на аппаратном, так и на программном уровне. Программные прерывания создаются с помощью расширенного набора инструкций процессора 80х86. Они были разработаны специально для того, чтобы дать возможность не только физическим устройствам мгновенно прерывать исполнение текущей программы. Большинство прерываний на персональном компьютере осуществляются программным путем. Однако некоторые осуществляются только с помощью аппаратуры (к ним относятся немаскируемые прерывания и прерывания от клавиатуры). С точки зрения программиста оба типа прерываний работают одинаково, поэтому нас это деление затрагивать не будет.
Внимание!
При использовании прерываний будьте очень осторожны: вы играете с огнем. Если вы допустите ошибку, компьютер может «зависнуть», что иногда приводит к потере важных данных. Будьте внимательны!
Итак, в соответствии с характером нашей игры мы должны выбрать нужные нам прерывания. Как их выбирать, еще не ясно, но мы разберемся с этим чуть позже. Затем нам нужно будет зарегистрировать (установить) свою собственную процедуру обработки прерываний. Вот, собственно, и все.
Единственное, чего нам не хватает для начала, это самой процедуры обработки прерываний, поэтому давайте разбираться, как она создается на языке Си.