ществить доступ к RTL. Для этого семейство микропроцессоров 8086
предоставляет одно решение в форме векторов прерываний. При уста-
новке вектора прерывания в точке адресации библиотеки любая
программа может осуществить к ней доступ путем использования инс-
трукции INT.
Семейство микропроцессоров 8086 поддерживает 256 векторов
прерываний, из которых, по крайней мере, 64 (от 00h до 39h) ре-
зервируются для аппаратуры системы или MS-DOS. Частичный список
векторов прерываний, используемых фирмой "Интел", стандартами
фирмы "ИБМ", базовой системой ввода-вывода (BIOS - Basic Input
Output System) фирмы "ИБМ" и MS-DOS приведен в таблице 3-5. Ос-
тальные векторы прерываний используются другими изготовителями.
Обычно векторы с более высокими номерами являются более надежными
для использования, хотя это можно подтвердить только тестировани-
ем. В нашем случае выбран вектор 40h, потому что при его исполь-
зовании система не разрушается.
____________________________________________________________
| |
| ПРЕДОСТЕРЕЖЕНИЕ |
| |
| Многие системы могут использовать векторы прерываний, |
| отличающиеся от определенных для MS-DOS. Перед ис- |
| пользованием любого вектора проверьте Руководство |
| системы. В результате изменения уже используемого |
| вектора может произойти полный отказ системы ! |
|____________________________________________________________|
Таблица 3-5
Векторы прерываний стандартов фирмы "ИБМ", процессора,
аппаратных средств, BIOS и MS-DOS
________________________________________________________________
| |
Прерывание | Определено | Использование
(шестн.знач.) | |
______________|____________|____________________________________
Int 0 | Интел | Прерывание из-за ошибки деления на
| | нуль
Int 1 | Интел | Прерывание "прослеживания" одного
| | шага
Int 2 | Интел | Немаскируемое прерывание аппаратных
| | средств
Int 3 | Интел | Прерывание контрольной точки
- 3-38 -
________________________________________________________________
| |
Прерывание | Определено | Использование
(шестн.знач.) | |
______________|____________|____________________________________
Int 4 | Интел | Прерывание из-за переполнения при
| | умножении
Int 5 | Интел | Исключительная ситуация "граница
| | 80x86"
| BIOS | Функция печати экрана
Int 6 | Интел | Исключительная ситуация "неопреде-
| | ленный код операции"
Int 7 | Интел | Исключительная ситуация "код опера-
| | ции ESC"
Int 8 / IRQ 0 | ИБМ | Аппаратные средства системного тай-
| | мера
Int 9 / IRQ 1 | ИБМ | Аппаратные средства клавиатуры
Int A / IRQ 2 | ИБМ - XT | Запасной запрос аппаратных средств
Int A / IRQ 2 | ИБМ - AT | IRQ 8 - IRQ F
Int B / IRQ 3 | ИБМ | Аппаратные средства последователь-
| | ного порта 2
Int C / IRQ 4 | ИБМ | Аппаратные средства последователь-
| | ного порта 1
Int D / IRQ 5 | ИБМ - XT | Аппаратные средства фиксированного
| | диска
Int D / IRQ 5 | ИБМ - AT | Параллельный порт 2
Int E / IRQ 6 | ИБМ | Аппаратные средства дискового конт-
| | роллера
Int F / IRQ 7 | ИБМ | Аппаратные средства параллельного
| | порта 1
Int 10 | BIOS | Обслуживание видео и экрана
Int 11 | BIOS | Список аппаратуры считывания
Int 12 | BIOS | Размер отчета памяти
Int 13 | BIOS | Обслуживание дискового ввода-вывода
Int 14 | BIOS | Обслуживание последовательного
| | ввода-вывода
Int 15 | BIOS | Обслуживание кассетной ленты и
| | расширенное обслуживание
Int 16 | BIOS | Обслуживание ввода-вывода клавиату-
| | ры
Int 17 | BIOS | Обслуживание ввода-вывода принтера
Int 18 | BIOS | Загрузчик Бэйсика
Int 19 | BIOS | Программа начальной загрузки (на-
| | чальный загрузчик)
Int 1A | BIOS | Обслуживание системного таймера и
| | часов
Int 1B | BIOS | Клавиши Control-Break клавиатуры
| | (из Int 9)
Int 1C | BIOS | Часы таймера пользователя
| | (из Int 08)
Int 1D - 1F | Интел | Зарезервировано
Int 20 | MS-DOS | Функция завершения старой (OLD)
| | программы
Int 21 | MS-DOS | Вызов функции MS-DOS
Int 22 | MS-DOS | Адрес завершения программы
Int 23 | MS-DOS | Адрес выхода Control-C
- 3-39 -
________________________________________________________________
| |
Прерывание | Определено | Использование
(шестн.знач.) | |
______________|____________|____________________________________
Int 24 | MS-DOS | Адрес аварийного завершения из-за
| | фатальной ошибки
Int 25 | MS-DOS | Функция чтения по абсолютному ад-
| | ресу на диске
Int 26 | MS-DOS | Функция записи по абсолютному ад-
| | ресу на диске
Int 27 | MS-DOS | Функция "завершить и оставить
| | резидентной"
Int 28 | MS-DOS | Цикл клавиатуры/Простой DOS (заре-
| | зервировано)
Int 29 | MS-DOS | Быстрый вывод консоли (зарезервиро-
| | но)
Int 2A | MS-DOS | Интерфейс MS-NET (зарезервировано)
Int 2B - 2D | MS-DOS | Зарезервировано для MS-DOS (IRET)
Int 2E | MS-DOS | Команда "выполнить" (зарезервиро-
| | вано)
Int 2F | MS-DOS | Управление принтером MS-DOS вер-
| | сии 3
Int 30 - 3E | MS-DOS | Зарезервировано для MS-DOS
Int 3F | MS-DOS | Управление оверлейным компоновщи-
| | ком
Int 4A | BIOS | Часы реального времени (от int 70)
Int 67 | EMS 4.0 | Спецификация расширяемой памяти
*Int 70/IRQ 8 | ИБМ | Аппаратные средства часов реального
| | времени
*Int 71/IRQ 9 | ИБМ | Прерывания аппаратных средств IRQ 2
*Int 72/IRQ A | ИБМ | Зарезервированные аппаратные
| | средства
*Int 73/IRQ B | ИБМ | Зарезервированные аппаратные
| | средства
*Int 74/IRQ C | ИБМ | Зарезервированные аппаратные
| | средства
*Int 75/IRQ D | ИБМ | Аппаратные средства сопроцессора
*Int 76/IRQ E | ИБМ | Аппаратные средства фиксированного
| | диска
*Int 77/IRQ F | ИБМ | Зарезервированные аппаратные
| | средства
______________|____________|____________________________________
* - только шины типа AT
В MS-DOS векторы прерывания могут быть установлены посредс-
твом использования функции MS-DOS с кодом 25h "Установить вектор
прерывания". Операция установки очень проста: в регистр AL зано-
сится номер вектора, а адрес для загрузки в вектор заносится в
пару регистров DS:DX (сегмент:смещение). В связи с тем, что в
программах типа .COM регистр DS устанавливается в то же самое
значение, что и регистр CS, содержимое регистра DS уже является
правильным для вызова. Затем загружаются оставшиеся регистры и
делается вызов с помощью следующего программного кода:
mov dx,offset entry ; получение точки входа RTL
mov al,v_num ; установка номера вектора
mov ah,25h ; установка вектора прерывания
doscall ; вызов MS-DOS
- 3-40 -
После того, как подпрограмма EXRTL установлена в памяти и
осуществляет доступ к вектору прерывания, установленному в табли-
це векторов прерываний, RTL готова для использования. Для ее вы-
зова подпрограмма использует инструкцию 40h и управление переда-
ется к подпрограмме EXRTL. Программа RTL_TEST, показанная в
листинге 3-6, является одним из примеров подпрограммы, осущест-
вляющей доступ к этой отдельной RTL.
Интерфейс между подпрограммами EXRTL и RTL_TEST полностью
обеспечивается через стек. Подпрограмма RTL_TEST помещает в стек
код функции и выполняет инструкцию int 40h. Заметим, что схема
стека в RTL отличается от такого интерфейса в инструкции CALL
(вызов), в котором прерывание помещает флажки в стек, а также
сегмент возврата и смещение.
Передача управления между двумя секциями показана на
Рис.3-12. Инструкция int 40h передает управление через таблицу
векторов прерываний в подпрограмму EXRTL. Затем подпрограмма
EXRTL выбирает код функции из стека, используя блок описания
структуры стека. Подпрограмма EXRTL анализирует правильность кода
функции и, если он правилен, передает управление к соответствую-
щему драйверу функции путем использования макроса case. После вы-
полнения функции подпрограмма EXRTL возвращает управление в под-
программу RTL_TEST по инструкции IRET (Return from Interrupt -
возврат из прерывания).
Стековая структура frame (смотри листинг 3-5) также обеспечи-
вает подпрограмме EXRTL доступ к флажкам вызывающей программы,
которые хранятся в стеке рядом с вектором. Путем копирования
флажков из стека в свой собственный регистр флажков подпрограмма