Прерывания 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 |