Реализация многозадачности при помощи прерываний
При работе под операционной системой 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. Они были разработаны специально для того, чтобы дать возможность не только физическим устройствам мгновенно прерывать исполнение текущей программы. Большинство прерываний на персональном компьютере осуществляются программным путем. Однако некоторые осуществляются только с помощью аппаратуры (к ним относятся немаскируемые прерывания и прерывания от клавиатуры). С точки зрения программиста оба типа прерываний работают одинаково, поэтому нас это деление затрагивать не будет.
Внимание!
При использовании прерываний будьте очень осторожны: вы играете с огнем. Если вы допустите ошибку, компьютер может «зависнуть», что иногда приводит к потере важных данных. Будьте внимательны!
Итак, в соответствии с характером нашей игры мы должны выбрать нужные нам прерывания. Как их выбирать, еще не ясно, но мы разберемся с этим чуть позже. Затем нам нужно будет зарегистрировать (установить) свою собственную процедуру обработки прерываний. Вот, собственно, и все.
Единственное, чего нам не хватает для начала, это самой процедуры обработки прерываний, поэтому давайте разбираться, как она создается на языке Си.