Прерывания BIOS и MS-DOS
Системное программное обеспечение аппаратных компонент ПК находится в ПЗУ, расположенной на системной плате и носит название BIOS(Basic Input-Output System, базовая система ввода-вывода).
Система BIOS выполняет процедуру самопроверки POST, которая активизируется при включении питания или при системном сбросе, проверяет аппаратуру системы и инициализирует для нормальной работы некоторые узлы, а также содержит ряд системных сервисов, например, определения объема памяти, конфигурации внешних устройств, установки даты и времени суток.
Кроме того, BIOS управляет всеми прерываниями. Система BIOS строит таблицу прерываний (инициализирует векторы прерываний), выполняет прерывание INT 11h (получение списка присоединенного оборудования) и INT 12h (запрос размера физической памяти). Подпрограммы обработки прерываний находятся в модуле ПЗУ, в том же, что и процедура POST.
Среди прерываний BIOS для пользователя могут быть полезны функции прерывания 10h (вывод информации на дисплей), 13h (дисковые операции), 14h (обмен данными через последовательный порт), 16h (обмен данными с клавиатурой), 17h (функции вывода на печать), 1Ah (функции времени) и ряд других.
Прерывания в диапазоне от 20h до 27h закреплены за функциями операционной системы MS-DOS (табл. 93). Эти прерывания проще в использовании и менее машинно-зависимы, чем их BIOS аналоги. Например, многие функции прерывания INT 21h не имеют собственной реализации, а только транслируются в один или несколько вызовов функций BIOS. Дополнительную информацию по применению функций можно получить в [2,4,6].
Табл. 93. Прерывания операционной системы MS-DOS.
| Номер | Описание прерывания |
| Завершение программы и передача управления операционной системе. | |
| Вызовы функций операционной системы MS-DOS. Вызов функции в соответствии с кодом в регистре AH. | |
| Адрес подпрограммы обработки завершения задачи. | |
| Адрес выхода при обработке комбинации Ctrl-Break. | |
| Адрес подпрограммы реакции на критическую ошибку. | |
| Абсолютное чтение с диска. | |
| Абсолютная запись на диск. | |
| Завершение программы с сохранением ее в памяти (резидентная программа). | |
| 28-3F | Зарезервированы для MS-DOS. |
Многие из функций MS-DOS осуществляют проверку своего выполнения. При успешном выполнении функции флаг CF равен 0, и 1 в случае возникновения ошибки. В последнем случае код ошибки возвращается в регистр AX. В табл. 94 описаны значения кодов ошибок.
Табл. 94. Коды ошибок при вызовах функций MS-DOS.
| Код | Значение |
| Ошибочный номер функции. | |
| Файл не найден. | |
| Путь к файлу не найден. | |
| Слишком много открытых файлов (не осталось свободных логических номеров). | |
| Доступ не разрешен. | |
| Ошибочный логический номер файла. | |
| Управляющий блок памяти разрушен. | |
| Недостаточно памяти. | |
| Ошибочный адрес блока памяти. | |
| Ошибочная аппаратная среда. | |
| Ошибочный формат. | |
| Ошибочный код доступа. | |
| Ошибочные данные. | |
| Ошибочное имя дисковода. | |
| Попытка удалить текущую директорию. | |
| Неверное устройство. | |
| Превышен предел числа файлов. |
Функции прерывания 21h предоставляют множество возможностей по взаимодействию с клавиатурой, дисплеем, дисковой системой, последовательным адаптером. Наиболее полезные функции перечислены в табл. 95.
Табл. 95. Функции прерывания 21h.
| Регистр | Операция | Дополнительные входные регистры | Выходные регистры |
| Функции по работе с клавиатурой | |||
| Ожидание набора символа на клавиатуре и последующее изображение его на экране (с проверкой на Ctrl-Break) | Не используются | AL = символ | |
| Чтение символа с клавиатуры (без проверки на Ctrl-Break) | DL = 0FFh | AL = очередной символ, если буфер клавиатуры не пуст; AL = 0, если буфер клавиатуры пуст | |
| Ожидание набора символа на клавиатуре без последующего его изображения (без проверки на Ctrl-Break) | Не используются | AL = символ | |
| То же, что функция 7, но с проверкой на Ctrl-Break | Не используются | AL = символ | |
| A | Чтение клавиатурной строки в буфер | DS:DX = Адрес буфера Первый байт буфера = размер буфера | Второй байт буфера = число фактически прочитанных символов |
| B | Чтение состояния клавиатуры | Не используются | AL = 0FFh, если клавиатурная строка пуста, AL = 0, если она содержит хотя бы один символ |
| C | Очистка буфера клавиатуры и вызов функции для работы с клавиатурой | AL = номер функции для работы с клавиатурой | В соответствии с вызываемой функцией |
| Функции по работе с дисплеем | |||
| Изображение символа (с проверкой на Ctrl-Break) | DL = символ | Не используются | |
| Печать символа | DL = символ | Не используются | |
| Изображение символа (без проверки на Ctrl-Break) | DL = символ | Не используются | |
| Изображение строки | DS:DX = адрес строки, которая должна заканчиваться символом $ | Не используются | |
| Функции для обмена данными с асинхронным последовательным портом | |||
| Ожидание ввода символа через асинхронное последовательное устройство | Не используются | AL = символ | |
| Вывод символа на асинхронное последовательное устройство | DL = символ | Не используются | |
| Функции управления файлами | |||
| D | Сброс текущего дисковода в начальное состояние | Не используются | Не используются |
| E | Задание нового текущего дисковода | DL = номер дисковода (0 = A, 1 = B, 2 = C) | AL = число дисководов (2 в случае одного дисковода) |
| 2E | Задание режима проверки | DL = 0 AL = 0 для отключения проверки AL = 1 для включения проверки | Не используются |
| Функции по работе с датами и временем | |||
| 2A | Чтение системной даты | Не используются | CX = год (1980-2099) DH = месяц (1-12) DL = день (1-31) |
| 2B | Установка системной даты | CX, DX = дата в том же формате, что и для функции 2A | AL = 0, если дата правильная AL = FF, если дата ошибочная |
| 2C | Чтение системного времени | Не используются | CH = часы (0-23) CL = минуты (0-59) DH = секунды (0-59) DL = сотые доли секунды (0-99) |
| 2D | Установка системного времени | CX, DX = время в том же формате, что и для функции 2C | AL = 0, если время правильное AL = FF, если время ошибочное |
| Функции по работе с векторами прерываний | |||
| Установка вектора прерывания | DS:DX = новое значение вектора | Не используются | |
| Чтение вектора прерывания | AL = номер (тип) прерывания | ES:BX = значение вектора | |
| Функции по работе с директориями | |||
| Создание директории (команда MKDIR) | DS:DX = адрес ASCIIZ-строки с именем директории | Возможен код ошибки 3 или 5 | |
| 3A | Удаление директории (команда RMDIR) | DS:DX = адрес ASCIIZ-строки с именем директории | Возможен код ошибки 3 |
| 3B | Смена текущей директории (команда CHDIR) | DS:DX = адрес ASCIIZ-строки с именем новой директории | |
| Чтение имени текущей директории | DL = номер дисковода (0 = текущий, 1 = А и т.д.) DS:DI = адрес буфера размером 64 байта | DS:SI = адрес ASCIIZ-строки Возможен код ошибки 15 | |
| Функции расширенного управления файлами | |||
| Получение сведений о свободном месте на диске | DL = номер дисковода (0 = текущий, 1 = А и т.д.) | AX = 0FFFFh, если обнаружена ошибка AX = число секторов в кластере BX = число свободных кластеров DX = общее число кластеров CX = число байтов в секторе | |
| 3C | Создание файла | DS:DX = адрес ASCIIZ-строки CX = атрибут файла | AX = логический номер файла Возможен код ошибки 3, 4 или 5 |
| 3D | Открытие файла | DS:DX = адрес ASCIIZ-строки AL = 0 при открытии для чтения AL = 1 при открытии для записи AL = 2 при открытии для чтения и записи | AX = логический номер файла Возможен код ошибки 2, 4, 5 или 12 |
| 3E | Закрытие логического номера файла | BX = логический номер файла | Возможен код ошибки 6 |
| 3F | Чтение файла или ввод данных с устройства | BX = логический номер файла CX = число считываемых байтов DS:DX = адрес буфера | AX = число фактически считанных байтов AX = 0 при попытке чтения за концом файла Возможен код ошибки 5 или 6 |
| Запись в файл или вывод данных на устройство | BX = логический номер файла CX = число записываемых байтов DS:DX = адрес буфера | AX = число фактически записанных байтов Возможен код ошибки 5 или 6 | |
| Удаление файла | DS:DX = адрес ASCIIZ-строки | Возможен код ошибки 2 или 5 | |
| Чтение атрибута файла | AL = 0 DS:DX = адрес ASCIIZ-строки с именем файла | CX = атрибут Возможен код ошибки 2 или 5 | |
| Установка нового атрибута файла | AL = 1 DS:DX = адрес ASCIIZ-строки с именем файла CX = атрибут | Возможен код ошибки 2 или 5 | |
| Чтение режима проверки | Не используются | AL = 0, если проверка выключена AL = 1, если проверка включена | |
| Переименование файла | DS:DX = адрес ASCIIZ-строки со старым именем файла ES:DI = адрес ASCIIZ-строки с новым именем файла | Возможен код ошибки 3, 5 или 17 |