
2.2.2. Примеры функций dos
DOS предоставляет набор системных вызовов, реализованных с использованием того же механизма программных прерываний, что и BIOS, но в отличие от функций BIOS, DOS реализует более сложные и высокоуровневые функции. Эти вызовы открывают прикладной программе доступ к системной информации, к системе консольного ввода/вывода, к файловой системе, к подсистеме управления программами и памятью, позволяют организовать обращение к драйверам устройств и т.д. Обработчик прерываний DOS находится в ядре ОС MS-DOS (файл MSDOS.SYS).
Все основные функции DOS вызываются с помощью прерывания INT 21H, однако DOS использует и другие прерывания:
INT 20H Завершить программу;
INT 21H Сервис DOS;
INT 25H/26H Абсолютные чтение/запись диска;
INT 27H Завершиться, но остаться резидентным;
INT 28H Квант времени DOS (НЕТ В ДОКУМЕНТАЦИИ);
INT 2EH Выполнить команду DOS (НЕТ В ДОКУМЕНТАЦИИ);
INT 2FH Мультиплексное прерывание (спулинг печати).
Получение системной информации
Функция 30H возвращает в регистре AX номер версии DOS. (Перед вызовом INT 21H надо поместить значение 30H в регистр AH. После выполнения AH и AL содержат номер версии используемой ОС.) Например, для версии MS-DOS 4.00 содержимое регистра AH равно 00, регистра AL - 04. Дополнительно через регистр BH функция возвращает программе серийный номер фирмы-производителя OEM: 00H - IBM, 16H - DEC, FFH - Microsoft и т.п.; в регистрах BL:CX после вызова функции находится серийный номер пользователя.
Эта информация может применяться для анализа возможности использования таких средств операционной системы, которые поддерживаются не всеми версиями DOS, или для настройки программы на конкретный серийный номер пользователя.
Функции 2AH и 2CH позволяют программе узнать системную дату и время.
Есть функции, возвращающие текущий диск и текущий каталог (19H и 47H).
Функция 2FH позволяет программе узнать адрес текущей области DTA (Disk Transfer Area), которая используется, например, при поиске файлов в каталоге.
Важная информация находится в блоке PSP (Programm Segment Prefix). Этот блок расположен в памяти непосредственно перед выполняющейся программой. В нем находятся, в частности, параметры, передаваемые программе при запуске. Функция 62H возвращает адрес текущего блока PSP.
Кратко перечислим некоторые другие функции для получения системной информации:
35H - получить значение вектора прерывания с заданным номером;
4DH - узнать код завершения процесса;
59H - получить расширенный код ошибки;
54H - узнать, используется ли проверка при записи на диск;
33H - узнать, используется ли проверка на CTRL+BREAK.
Символьный ввод/вывод
Эти функции применяются для работы со всеми символьными устройствам, такими, как консоль, принтер, последовательный порт, и называются функциями стандартного ввода/вывода. Ввод/вывод программы, использующей стандартные функции, может быть переназначен.
Начиная с версии 2.0, DOS поддерживает UNIX-подобную концепцию переназначения устройств стандартного ввода и стандартного вывода. Эта концепция определяет способ, которым одна программа направляет свой вывод в другую или перехватывает вывод другой программы. Если ввод/вывод не переназначен, стандартный ввод вводит с клавиатуры, а стандартный вывод выводит на экран; и тот, и другой являются функциями устройства CON. Родительский процесс (такой как COMMAND.COM) может переназначить стандартный ввод, стандартный вывод или и тот, и другой, перед тем как передать управление порожденному процессу. Это предоставляет мощный способ передачи информации от процесса к процессу при минимальных программных издержках.
Перечислим основные функции стандартного символьного ввода/вывода: ввод символов с клавиатуры (01H, 06H, 07H, 08H); отображение символов на устройстве вывода (02H, 09H); ввод из последовательного порта (03H); вывод в последовательный порт (04H); вывод на принтер (05H).
Для примера рассмотрим функцию 09H, позволяющую отобразить строку символов на устройстве вывода. Перед вызовом этой функции надо записать в регистр AH значение 09H, в пару регистров DS:DX - адрес сегмента данных и смещение строки в этом сегменте, заканчивающейся символом '$'. После вызова прерывания INT 21H строка, исключая завершающий ее символ '$', посылается на стандартный вывод (чаще всего - на экран дисплея).
Работа с файловой системой
DOS предоставляет программам обширный сервис для работы с файлами и дисками. Практически все файловые операции можно выполнять с помощью специально предназначенных для этого функций, лишь в некоторых случаях (защита данных от копирования, например) приходится использовать прямое обращение к диску.
С помощью файловых функций DOS можно создавать и удалять файлы и каталоги, открывать и закрывать файлы, создавать временные файлы. Ввод/вывод может быть буферизован, можно получить как последовательный доступ к содержимому файла, так и произвольный.
Рассмотрим для примера несколько функций работы с файловой системой: открыть файл (3CH), записать в файл (40H), закрыть файл (3EH). Но перед этим познакомимся с понятием описателя файла.
Начиная с DOS версии 2.0, в репертуар DOS включены UNIX-подобные файловые функции. Идея их состоит в том, что при открытии файла DOS возвращает 16-битовое значение описателя файла (Handle). После этого, когда выполняется чтение, позиционирование, запись или закрытие файла, для ссылки на файл используется описатель. При этом к некоторым устройствам можно обращаться так, как будто это дисковые файлы, через зарезервированные описатели DOS:
0 - Стандартное устройство ввода;
1 - Стандартное устройство вывода;
2 - Стандартное устройство ошибок;
3 - Стандартное устройство AUX;
4 - Стандартный принтер.
Функция 3CH - Создать файл через описатель:
+-------------------------------------------------------
¦ Вход ¦ AH ¦ 3cH
+---------¦ DS:DX ¦ адрес строки ASCIIZ с именем файла
¦ CX ¦ атрибут файла
+---------+-------+-------------------------------------
¦ Выход ¦ AX ¦ код ошибки если CF установлен
+---------¦ ¦ описатель файла если ошибки нет
+---------------------------------------------
Описание:
- DS:DX указывает на строку ASCIIZ в формате:
"d:\путь\имяфайла",0. Строка должна обязательно заканчиваться нулевым байтом. Если диск и/или путь опущены, они принимаются по умолчанию;
- файл создается в указанном (или умалчиваемом) оглавлении;
- файл открывается в режиме доступа чтение/запись;
- вы должны сохранить описатель (handle) для последующих операций;
- если файл уже существует:
- при открытии файл усекается до нулевой длины;
- если атрибут файла - только чтение, открытие отвергается (атрибут можно изменить функцией 43H Изменить Атрибут);
- CONFIG.SYS специфицирует число доступных описателей в системе (параметр FILES);
- Используйте функцию 5bH Создать Новый Файл, если вы не хотите перекрывать (усекать) существующий файл.
Функция 40H - Записать данные в файл через описатель:
+--------------------------------------------------------¦ Вход ¦ AH ¦ 40H
+---------¦ BX ¦ описатель файла
¦ DS:DX ¦ адрес буфера, содержащего
¦ ¦ записываемые данные
¦ CX ¦ число записываемых байт
+---------+-------+--------------------------------------¦ Выход ¦ AX ¦ код ошибки если CF установлен
+---------¦ AL ¦ число реально считанных байт
+----------------------------------------------
Описание:
CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX. Данные записываются, начиная с текущей позиции указателя чтения/записи файла.
Функция 3EH - Закрыть файл с описателем:
+--------------------------------------------------
¦ Вход ¦ AH ¦ 3eH
+---------¦ BX ¦ описатель файла
+---------+-------+--------------------------------
¦ Выход ¦ AX ¦ код ошибки если CF установлен
+--------------------------------------------------
Описание:
BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфера сбрасываются, и оглавление обновляется корректными размером, временем и датой.
Управление программами
DOS предоставляет возможность организовать запуск других программ или загрузку и выполнение программных оверлеев. Для этого служит функция 4BH.
Для завершения работы программа должна также использовать одну из специальных функций DOS. Функция 4CH, завершая работу программы позволяет передать ОС некоторое число, называемое кодом завершения программы.
Существует также ряд других функций управления программами, например, функция 31H или прерывание INT 27H оставляет завершившуюся программу резидентной в памяти.
Управление памятью
DOS управляет распределением памяти с помощью блоков управления памятью MCB (Memory Control Block). Вся память разбивается на блоки различного размера, которым предшествует MCB, содержащий характеристики данного блока памяти (например, его размер).
Программа может динамически получать и освобождать области памяти с помощью функций 48H и 49H соответственно. Можно также изменять размер блока, выделенного программе операционной системой. Это делает функция 4AH.
Связь с драйверами устройств
Программы не могут непосредственно обращаться к драйверам устройств ввода/вывода. Все обращения к драйверам имеют либо неявный характер (ввод/вывод с помощью функций прерывания INT 21H), либо используют специальную функцию DOS с кодом 44H.
Другие функции
Существуют функции, позволяющие переопределять прерывания, работать с системными часами и календарем, функции для работы в сети и некоторые другие.
Обработка ошибок
Если выполнение заданной операции невозможно по каким-то причинам (неправильные операнды, устройство неработоспособно, запрашиваемая операция не поддерживается и т.д.), то для большинства функций DOS устанавливается признак ошибки - флаг переноса CARRY в PSW; регистр AX при этом содержит код ошибки. Для MS-DOS версии 3.0 и более поздних версий обработка ошибок значительно расширена. Введена функция 59H прерывания INT 21H, предназначенная для получения дополнительной информации об ошибках.
Практическая часть:
Задание №1
Получение списка оборудования ЭВМ
Код программы:
Program prg1;
Uses dos;
Var ax:word;
R:registers;
function binary( x: integer; n: byte ): string;
var bit, i: byte;
s: string[16];
begin
s:= '';
for i:=0 to 15 do begin
bit:= (x shl i) shr (15);
s:= s + chr(ord('0') + bit)
end;
delete(s, 1, 16-n);
Binary:=s;
end;
begin
intr($11, R);
Ax:=R.Ax;
Writeln (binary (ax,16));
Readln;
End.
Выданный результат:
0 1 00 01 00 0 010 0 1 11
Интерпретация:
0: 0 = нет дисковых устройств;
1: 8087 сопроцессор (ненадежно);
2-3: материнская плата ОЗУ: 00=16K;
4-5: начальный/активный режим: 01=40-кол цветн;
6-7: число приводов дискет: 00=1;
8: DMA отсутствует;
9-11: RS232 порты: 010 = 2;
12: 0 = игровой адаптер отсутствует;
13: 1 = последоватеьный принтер (только для PCJr);
14-15: установлено принтеров: 11 = 3.
Задание №2
Определение размера основной памяти ЭВМ
Код программы:
Program prg1;
Uses dos;
Var ax:word;
R:registers;
begin
intr($12, R);
Ax:=R.Ax;
Writeln (ax);
Readln;
End.
Результат: 638
Задание №3
Определение версии DOS
Код программы:
Program prg3;
Uses dos;
Var ah, al:byte;
R:registers;
Begin
R.Ah:=$30;
intr($21, R);
Ah:=R.Ah;
Al:=R.Al;
Write(Al);
Write(‘.’);
Write(Ah);
Readln;
End.
Результат: вывод строки '6.22'
Задание №4
Отображение строки символов на устройстве вывода (дисплее) с использованием функций стандартного ввода/вывода DOS.
Код программы:
Program prg4;
Uses dos;
Var str:string;
R:registers;
Begin
Str:=’Stroka simvolov$’;
R.Ah:=$09;
R.Ds:=seg(str);
R.Dx:=ofs(str[1]);
intr($21, R);
Readln;
End.
Результат: строка 'Stroka simvolov' выведена на экран. Кроме того, меняя значение регистра AH мы можем менять устройство вывода.
Задание №5
Выполнение стандартных файловых операций (создание, запись, закрытие) с использованием Handle-ориентированного ввода/вывода.
Код программы:
Program prg5;
Uses dos;
Var
hand, str:string;
R1, R2, R3:registers;
Hand: word;
Begin
Nazv:=’c:\bp\proba.txt$’;
R1.Ah:=$3c;
R1.Ds:=seg(nazv);
R1.Dx:=ofs(nazv[1]);
Intr($21, R1);
Hand:=R1.Ax;
Writeln(hand);
Readln;
Str:=’Proba nadpisi v faile$’;
R2.Ah:=$40;
R2.Bx:=Hand;
R2.Ds:=seg(str);
R2.Dx:=ofs(str[1]);
R2.Cx:=21;
Intr($21, R2);
Writeln(R2.Al);
Readln;
R3.Ah:=$3e;
R3.Bx:=Hand;
Intr($21, R3);
End.
Результат: создан текстовый файл