Интерпретатор командных строк обеспечивает средства, необходимые
для того, чтобы программа, написанная на языке ассемблера, начала
выполняться. Кроме того, DOS уже во время выполнения программы
обеспечивает доступ к файловой системе с помощью механизма функций
DOS. В данном разделе объясняется, что представляют собой эти
функции и как они могут быть использованы в программе.
Программа использует функции DOS посредством программного
прерывания. Благодаря этому, программа может вызывать
соответствующую служебную программу, не зная ее адреса. Нужное
прерывание задается программистом. А во время инициализации DOS
векторы прерывания для функций системы определяются таким образом,
чтобы они указывали на соответствующие подпрограммы. Следовательно,
по мере получения других версий DOS нет необходимости вносить
изменения в программы. На Фиг.5.3 приводятся векторы прерывания
DOS.
Прерывание Действие
----------------------------------------------
20H Окончание программы
21H Вызов функции (см. Фиг. 5.5)
22H Адрес завершения
23H Адрес CTRL-BREAK
24H Обработчик кртической ошибки
25H Чтение с диска по абсолютному адресу
26H Запись на диск по абсолютному адресу
27H Завершить, но остаться резидентно
----------------------------------------------
Фиг. 5.3 Прерывания DOS
Некоторые прерывания фактически предназначены для
пользовательских подпрограмм. Прерывания 22H, 23H и 24H являются
указателями на подпрограммы, которые могут быть в программе
пользователя. Эти векторы определяют программу, которая должна
выполняться при наступлении соответствующей ситуации. Например, при
нажатии клавиши CTRL-BREAK DOS выполняет прерывание 23H. Обычно
нажатие этой клавиши вызывает останов программы. Обычно DOS
выполняет стандартную обработку соответствующих ситуаций. Если же
программе нужно обрабатывать их иначе, то она может изменить вектор
прерывания.
В качестве примера рассмотрим прерывание 24H - обработку
неустранимой ошибки. Всякий раз обнаруживая ошибку система
инициирует прерывание. Обычно соответствующий вектор указывает на
программу в DOS, которая выводит на дисплей сообщение об ошибке. В
случае ошибки, связанной с диском, DOS выводит сообщение о дисковой
ошибке. Пользователь может по своему усмотрению сделать повторную
попытку выполнения операции, вызвавшей ошибку, либо закончить
выполнение, либо пропустить операцию, вызвавшую ошибку.
Предположим, например, что вы пишите программу форматирования
дискет. Это операция, в ходе которой на поверхности дискеты
происходит физическая разметка дорожек и секторов. Вместе с
форматированием дискеты проверяется отсутствие сбойных участков.
Последняя операция называется верификацией дискеты. Так как при
верификации допускается присутствие на дискете одно-двух сбойных
участков, то вы специальным образом помечаете эти участки, чтобы в
дальнейшем их случайно не использовать. Данная программа
форматирования заменяет обработку неустранимых ошибок. Вам не
нужно, чтобы DOS выводила для пользователя сообщение об ошибке.
Вместо этого вы хотите, чтобы обработка ошибки верификации
происходила в самой программе, и соответствующий участок на диске
помечался как сбойный. Для этого вы заменяете вектор прерывания в
ячейке 0:0090H(24H*4) указателем на свою подпрограмму обработки
ошибок. Когда DOS зафиксирует дисковую ошибку, ваша подпрограмма
может пометить это место как сбойный участок, никак не уведомляя об
этом пользователя.
Прерывания 25H и 26H связывают между собой две части системы. С
точки зрения своей файловой структуры DOS фактически состоит из
двух компонент. Одна из них, IBMBIO.COM, включает программы
непосредственного доступа к аппаратным средствам. Другая,
IBMDOS.COM реализует файловую систему. Упомянутые два прерывания
используются, когда компонента DOS, относящаяся к файловой системе,
обращается к другой компоненте - BIO. Хотя эти прерывания и могут
использоваться программистом, основное их назначение - разделить
две части DOS. Прерывание 25H осуществляет чтение, а прерывание 26H
- запись информации с абсолютной адресацией диска. На этом уровне
обеспечивается доступ к определенным участкам диска, а не записям в
файле.
Прерывания 20H и 27H обеспечивают механизм возврата управления
к DOS после выполнения программы. Прерывание 20H соответствует
нормальному завершению работы программы. Прерывание 27H интересно
тем, что хотя оно связано с завершением программы, занимаемая
программой область памяти не возвращается обратно в распоряжение
DOS. Все содержимое данной области сохраняется неизменным до тех
пор, пока не будет выключено питание или выполнена переустановка
системы в начальное состояние. Это удобно в тех случаях, когда
нужно ввести специальную обработку прерываний, либо аналогичную
функцию, которая должна сохраниться как часть системного
программного обеспечения. В гл.10 будет приведен пример
использования прерывания INT 27H для расширения системы. В DOS
имеется особенность работы с прерываниями 20H и 27H. Их
Значение
в AH Функция
----------------------------------------------------------
0 Завершение программы
1 Ввод с клавиатуры
2 Вывод на экран
3 Дополнительный ввод (асинхронная коммуникация)
4 дополнительный вывод
5 Вывод на принтер
6 Прямой ввод/вывод с консоли
7 Прямой ввод с консоли без эха
8 Ввод с консоли без эха
9 вывод строки
OAH Буферизованный ввод с клавиатуры
0BH Проверка состояния клавиатуры
0CH Очистка буфера клавиатуры и функция # в AL
0DH Переустановка диска
0EH Выбор диска
0FH Открытие файла
10H Закрытие файла
11H Поиск первого
12H Поиск следующего
13H Уничтожение файла
14H Последовательное чтение
15H Последовательная запись
16H Создание файйла
17H Переименование файла
19H Текущий диск
1AH Установка адреса обмена с диском
1BH Адрес таблицы размещения
21H Прямое чтение
22H Прямая запись
23H Размер файла
24H Установка записи для прямого обращения
25H Установка вектора прерывания
26H Создание нового програмного сегмента
27H Прямое чтение блока
28H Прямая запись блока
29H Анализ имени файла
2AH Чтение даты
2BH Установка даты
2CH Получение времени
2DH Установка времени
-------------------------------------------------------
Фиг. 5.4 Функции прерывания DOS 21H
использование предпочтительней в файле типа .COM, так как файл типа
.EXE имеет существенно другой формат и использование в нем этих
функций DOS немного сложнее. В следующем разделе будут рассмотрены
различия между файлами типа .COM и типа .EXE и то, почему
упомянутые прерывания, связанные с завершением работы программы,
выполняются в них по-разному.
Прерывание 21H является прерыванием, через которое происходи
обращение к основным функциям DOS. Это прерывание обеспечивает
доступ к системе ввода-вывода, управляемой DOS. На Фиг.5.4
представлены все возможные функции, использующие это прерывание.
Выбор функции в программе осуществляется с помощью записи в регистр
AH нужного значения перед выполнением прерывания 21H.
Параметры этих функций приводятся в приложении D руководства по
DOS. Вместо подробного ознакомления мы разберем пример, в котором
использованы некоторые из них. В частности, этот пример включает
функции DOS, связанные с диском.