AsmTool
INT 21H
Запрос функций DOS
Описание:
Основная операция DOS, вызывающая
определенную функцию в соответствии с кодом в регистре AH. Назначение функций
DOS описано в следующем разделе.
Функции:
ФУНКЦИИ ПРЕРЫВАНИЯ DOS INT 21H
________________________________________________________________
Ниже приведены базовые функции для прерывания DOS INT 21H. Код
функции устанавливается в регистре AH:
00 Завершение программы (аналогично INT 20H).
Вход
AH = 00H
CS = сегмент PSP завершающегося процесса
Выход
нет = (неприменим)
Описание:
передает управление на вектор завершения в PSP (выходит в родительский
процесс). Идентична функции INT 20H Terminate.
регистр CS должен указывать на PSP. восстанавливает векторы прерываний DOS 22H-24H
(завершение, Ctrl-Break и Критическая ошибка),
устанавливая значения, сохраненные в родительском PSP. выполняет сброс файловых
буферов. файлы должны быть
предварительно закрыты, если их длина изменилась.
Замечание:
Проще и более аккуратно - использовать функцию DOS Fn
4cH Exit.
01 Ввод символа с клавиатуры с эхом на экран.
Вход
AH = 02H
Выход
AL = символ, полученный из стандартного ввода
Описание:
Считывает (ожидает) символ со стандартного входного устройства. Отображает этот
символ на стандартное выходное устройство (эхо). при распознавании Ctrl-Break
выполняется INT 23H.
Замечание:
ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и
т.п.) требует двух обращений к этой функции. первый вызов возвращает AL=0. Второй вызов возвращает в AL
расширенный код ASCII.
02 Вывод символа на экран.
Вход
AH = 02H
DL = символ, выводимый на стандартный вывод
Выход
нет =
Описание:
Посылает символ из DL на стандартный вывод. обрабатывает символ Backspace
(ASCII 8), перемещая курсор влево на одну позицию и оставляя его в новой
позиции. при обнаружении Ctrl-Break выполняется INT
23H.
03 Ввод символа из асинхронного коммуникационного
канала.
Вход
AH = 03H
Выход
AL = символ, полученный со стандартного
вспомогательного устр-ва
Описание:
Считывает (ожидает) символ со стандартного вспомогательного устройства, COM1
или AUX и возвращает этот символ в AL.Замечание:
ввод не буферизуется и должен опрашиваться (не управляется прерываниями). при запуске DOS порт AUX (COM1)
инициализируется так: 2400 бод, без проверки на четность, 1 стоп-бит, 8-битовые
слова. Команда DOS MODE используется для установки иных характеристик.
04 Вывод символа на асинхронный коммуникационный канал.
Вход
AH = 04H
Выход
нет
Описание:
Посылает символ в DL на стандартное вспомогательное устройство, COM1 или AUX.
05 Вывод символа на печать.
Вход
AH = 05H
DL = символ, записываемый на стандартный принтер
Выход
нет
Описание:
Посылает символ в DL на стандартное устройство принтера, обычно LPT1.Замечание:
команда DOS MODE может перенаправить этот вывод в последовательный порт.
06 Прямой ввод с клавиатуры и вывод на экран.
Вход
AH = 06H
DL = символ (от 0 до 0feH), посылаемый на стандартный вывод
= 0ffH запрос ввода со стандартного ввода
Выход
ZF = Сброшен (NZ), если символ готов при запросе ввода
Описание:
при DL = 0ffH выполняет ввод с консоли "без ожидания", возвращая
взведенный флаг нуля (ZF), если на консоли нет готового символа. если символ готов, сбрасывает
флаг ZF (NZ) и возвращает считанный символ в AL. если DL не равен 0ffH, то DL
направляется на стандартный вывод.Замечание:
Не проверяет Ctrl-Break. вызывайте дважды для расширенного ASCII.
07 Ввод с клавиатуры без эха и без проверки Ctrl/Break.
Вход
AH = 07H
Выход
AL = символ, полученный через стандартный ввод
Описание:
Считывает (ожидает) символ со стандартного входного устройства и возвращает
этот символ в AL. Не фильтрует: Не проверяет на Ctrl-Break,
backspace и т.п.Замечание:
вызывайте дважды для ввода расширенного символа ASCII. используйте Fn 0bH для проверки статуса (если не хотите ожидать нажатия
клавиши).
08 Ввод с клавиатуры без эха с проверкой Ctrl/Break.
Вход
AH = 08H
Выход
AL = символ, полученный через стандартный ввод
Описание:
Считывает (ожидает) символ со стандартного входного устройства и возвращает
этот символ в AL. при обнаружении Ctrl-Break
выполняется прерывание INT 23H.Замечание:
вызывайте дважды для ввода расширенного символа ASCII.
09 Вывод строки символов на экран .
Вход
AH = 09H
DS:DX = адрес строки, заканчивающейся символом "$" (ASCII 24H)
Выход
нет
Описание:
строка, исключая завершающий ее символ "$", посылается на стандартный
вывод. символы Backspace обрабатываются как в функции 02H Display Char. обычно, чтобы
перейти на новую строку, включают в текст пару CR/LF (ASCII 13H и ASCII 0aH).
строки, содержащие "$", можно выдать через 40H Write
Handle (BX=0).
0А Ввод с клавиатуры с буферизацией .
Вход
AH = 0AH
DS:DX = адрес входного буфера (смотри ниже)
Выход
нет = буфер содержит ввод, заканчивающийся символом CR
(ASCII 0dH)
Описание:
при входе буфер по адресу DS:DX должен быть оформлен так:
+---+---+---+---+---+---+- - -
¦max¦ ? ¦ ? ? ? ? ? MAX -
максимально допустимая
+---+---+---+---+---+---+ - - длина ввода (от 1 до 254)
при выходе буфер заполнен данными следующим образом:
+---+---+---+---+---+---+- - -
¦max¦len¦ T E X T 0dH LEN - действительная длина
данных
+---+---+---+---+---+---+ - - без завершающего CR (здесь - 04H).
символы считываются со стандартного ввода вплоть до CR
(ASCII 0dH) или до достижения длины MAX-1. если достигнут MAX-1, включается
консольный звонок для каждого очередного символа, пока не будет введен возврат
каретки CR (нажатие Enter).
Второй байт буфера заполняется действительной длиной введенной строки, не считая
завершающего CR. последний символ в буфере - всегда CR (который не засчитан в
байте длины). символы в
буфере (включая LEN) в момент вызова используются как "шаблон". В
процессе ввода действительны обычные клавиши редакти рования:
Esc выдает "\" и начинает с начала, F3
выдает буфер до конца шаблона, F5 выдает "@" и сохраняет текущую
строку как шаблон, и т.д. большинство расширенных кодов ASCII игнорируются. при распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается
неизменным).
0В Проверка наличия ввода с клавиатуры.
Вход
AH = 0BH
Выход
AL = 0ffH, если символ доступен со стандартного ввода
Описание:
проверяет состояние стандартного ввода. при распознавании Ctrl-Break
выполняется INT 23H. Замечения: используйте перед
функциями 01H 07H и 08H, чтобы избежать ожидания нажатия клавиши.
Эта функция дает простой неразрушающий способ проверки Ctrl-Break
в процессе длинных вычислений или другой обработки, обычно не требующей ввода. это позволяет вам снимать счет по
нажатию Ctrl-Break.
0С Очистка буфера ввода с клавиатуры и запрос на ввод.
Вход
AH = 0CH
AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0aH)
Выход
нет
Описание:
Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию
ввода, указанную в AL. это заставляет систему ожидать ввод очередного символа. следующие значения допустимы в
AL: 01H ввод с клавиатуры
06H ввод с консоли
07H Нефильтрующий без эха
08H ввод без эха
0aH буферизованный ввод
0D Сброс диска.
Вход
AH = 0CH
AL = номер функции ввода DOS (01H, 06H, 07H, 08H или 0aH)
Выход
нет
Описание:
Сбрасывает (пишет на диск) все файловые буфера. если размер файла изменился, такой файл должен быть
предварительно закрыт (при помощи функций 10H или 3eH).
0Е Установка текущего дисковода.
Вход
AH = 0FH
DS:DX = адрес неоткрытого FCB
Выход
AL = 0 если файл открыт без ошибок (и FCB заполнен)
Описание:
диск, указанный в DL, становится текущим (умалчиваемым) в DOS. проверка:
используйте функцию 19H "дать текущий" для проверки. В регистре AL
возвращается число дисководов всех типов, включая твердые диски и
"логические" диски (как B: в 1-floppy системе).
0F Открытие файла через FCB.
Вход
AH = 0EH
DL = номер диска (0=A, 1=B и т.д.), который становится текущим
Выход
AL = общее число дисководов в системе
Описание:
файл, описываемый неоткрытым FCB, должен существовать в текущем оглавлении на
диске, специфицированном в FCB (0=текущий, 1=A, 2=B, и т.д.).
если файл не существует, возвращается AL=0ffH. файл
открывается в режиме совместимости. если поле Drv в
FCB равно 0 в момент вызова, то оно заполняется номером текущего дисковода
(1=A, 2=B, и т.д.). Поле FCB CurBlk устанавливается в
0. Поле FCB RecSize устанавливается в 80H. Поля даты
и размера файла в FCB устанавливаются из оглавления.
Замечание:функции DOS 2.0+, ориентированные на номер файла (handle),
ГОРАЗДО удобнее в работе.
10 Закрытие файла через FCB.
Вход
AH = 10H
DS:DX = адрес открытого FCB
Выход
AL = 0 если файл закрыт без ошибок
Описание:
файл должен находиться на своем первоначальном месте в текущем оглавлении
диска, на котором он был открыт. если
файл найден, оглавление обновляется, файловые буфера сбрасываются, и
возвращается AL=00H. если файл не найден, оглавление не обновляется, происходит
масса малоприятных вещей, и в конце концов возвращается AL=0ffH.
11 Начальный поиск файла по шаблону.
Вход
AH = 11H
DS:DX = адрес неоткрытого FCB (имя файла может содержать '?')
Выход
AL = 0 если подходящее имя найдено (и DTA заполнена)
Описание:
В текущем оглавлении DOS ищется имя файла, соответствующее шаблону, заданному в
FCB по адресу DS:DX. при неудаче возвращается AL=0ffH. если имя найдено, AL
очищается, в 1-й байт DTA помещается номер дисковода (A=1, B=2, и т.д.), а в
следующие 32 байта помещается элемент оглавления для найденного файла можно
использовать при вызове расширенный FCB, чтобы выбирать файлы с указанными
атрибутами. В этом случае в DTA помещаются байт 0ffH, 7 байт нулей, номер диска
и элемент оглавления. В любом случае должен быть предоставлен корректный
неоткрытый FCB. функция 12H Find Next
FCB используется для поиска следующих имен.
Замечания: если вы намереваетесь искать последующие
файлы, не выполняйте никаких операций в/в с найденным
файлом. Скопируйте FCB
куда-нибудь в другое место, прежде чем открывать его. функция DOS
2.0+ 4eh "Найти 1-й
файл" легче в использовании; она поддерживает обычный формат d:\путь\имяфайла.
12 Поиск следующего файла по шаблону.
Вход
AH = 12H
DS:DX = адрес неоткрытого FCB (имя файла может содержать '?')
Выход
AL = 0 если подходящее имя файла найдено (и DTA заполнена)
Описание:
используется после вызова 11H "Найти 1-й FCB" с обобщенным именем
файла. каждый последующий
вызов заполняет DTA очередным подходящим элементом оглавления и возвращает
AL=00H. если подходящих имен больше нет, возвращается AL=0ffH. резервируемая
область в FCB сохраняет информацию, необходимую для продолжения поиска. Поэтому
не открывайте FCB между вызовами.
13 Удаление файла с диска.
Вход
AH = 13H
DS:DX = адрес неоткрытого FCB (имя файла может содержать '?')
Выход
AL = 0 если файл удален
Описание:
Эта функция удаляет все подходящие файлы в текущем оглавлении указанного диска
согласно спецификации в FCB. если подходящих файлов не найдено, или если доступ
отвергнут (как при попытке удалить файл с атрибутом Read-Only),
функция возвращает в регистре AL значение 0ffH.
14 Последовательное чтение файла.
Вход
AH = 14H
DS:DX = адрес открытого FCB
Выход
AL = 0 если чтение было успешным и DTA содержит
данные AL = 1 если достигнут конец файла
(EOF) и данные не были считаны AL = 2
если DTA+ FCB RecSiz выходит за сегмент (чтения не
было) AL = 3 если EOF и считана
усеченная запись (дополнена нулями)
Описание:
Читает FCB RecSize байт с адреса в файле,
специфицированного полями CurBlk и CurRec, в DTA. затем соответственно увеличивает
значения этих полей в FCB перед началом последовательной обработки файла
сбрасывайте CurRec в 0, так как функция 0fH Open FCB не инициализирует это поле.
15 Последовательная запись файла.
Вход
AH = 15H
DS:DX = адрес открытого FCB
Выход
AL = 0 если запись была успешной AL = 1 если ошибка переполнения диска
(данные не записаны) AL = 2 если DTA+
FCB RecSize выходит за сегмент (записи не было)
Описание:
Пишет FCB RecSize байт из DTA в файл по адресу, специфицированному
полями CurBlk и CurRec.
затем соответственно увеличивает значения этих полей в FCB
перед началом последовательной обработки файла сбрасывайте значение CurRec в 0, ибо функция 0fH Open
FCB не инициализирует это поле.
16 Создание файла.
Вход
AH = 16H
DS:DX = адрес неоткрытого FCB
Выход
AL = 0 если файл создан без ошибок (и FCB заполнен)
Описание:
файл, специфицированный неоткрытым FCB, создается в текущем оглавлении на
диске, указанном в FCB (0=текущий, 1=A, и т.д.). FCB заполняется аналогично
функции 0fH Open FCB. если файл существует в момент
вызова, его элемент оглавления используется для создаваемого файла, а длина
файла сбрасывается в 0.
Замечания: Handle-ориентированные функции DOS 2.0+
гораздо удобнее в работе.
17 Переименование файла.
Вход
AH = 17H
DS:DX = адрес FCB специального формата
Выход
AL = 0 если файл переименован успешно
Описание:
Переименовывает файл в текущем умалчиваемом оглавлении.
используйте следующую структуру FCB для этой функции:

каждое
из имен может содержать обобщенные символы "?": В старом имени
обобщенные символы приводят к поиску и переименованию всех подходящих файлов в
текущем оглавлении. В новом имени символ "?" означает, что в этой
позиции следует оставить тот же символ, что в аналогичной позиции старого
имени.
Замечания: Handle Эта функция позволяет переименовать само
оглавление, используя расширенный FCB с подходящим атрибутом для "старого
имени".
19 Определение текущего дисковода.
Вход
AH = 19H
Выход
AL = номер текущего умалчиваемого диска (0=A, 1=B, и т.д.)
Описание:
возвращает номер дисковода текущего умалчивемого
диска DOS.
1А Установка области передачи данных
(DTA.
Вход
AH = 1AH
DS:DX
= адрес для DTA
Выход
нет
Описание:
устанавливает адрес DTA.
все
FCB-ориентированные операции работают с DTA.
DOS не позволяет операциям в/в пересекать
границу сегмента.
функции
поиска: 11H 12H 4eH и 4fH помещают данные в DTA.
DTA
глобальна, поэтому будьте осторожны, назначая ее в
рекурсивной или реентерабельной процедуре.
при
запуске программы ее DTA устанавливается по смещению 80H относительно PSP.
1В Получение таблицы FAT для текущего дисковода.
Вход
AH = 1BH
Выход
DS:BX = адрес байта FAT ID (отражающего тип диска)
DX
= всего кластеров (единиц распределения) на диске
AL
= секторов на кластер
CX
= байт на сектор
Описание:
возвращает информацию о размере и типе умалчиваемого диска.
размер диска в байтах = (DX * AL * CX). Ищите
свободную память функциями 36h Disk Free или 32h Disk Info.
1С Получение FAT для любого дисковода.
Вход
AH = 1CH
DL
= номер диска (0=текущий, 1=A, и т.д.)
Выход
DS:BX = адрес байта FAT ID (отражающего тип диска)
DX
= всего кластеров (единиц распределения) на диске
AL
= секторов на кластер
CX
= байт на сектор
Описание:
Аналогична функции 1bH Get FAT Cur,
с той разницей, что регистр DL указывает диск, для которого вы хотите получить
информацию.
21 Чтение с диска с прямым доступом.
Вход
AH = 21H
DS:DX
= адрес открытого FCB
Выход
AL = 0 если чтение было успешным и DTA заполнена данными
AL
= 1 если достигнут конец файла (EOF) и чтения не было
AL
= 2 если DTA + FCB RecSize выходит за сегмент (чтения
нет)
AL
= 3 встречен EOF и считана усеченная запись (дополнена
нулями)
Описание:
приводит поля FCB CurBlk и CurRec
в соответствие с RandomRec, затем читает RecSize байт по указанному адресу в файле, помещая
считанные данные в DTA. Поле RecSize в момент вызова
должно содержать длину записи, а поле RandomRec в FCB
- номер требуемой записи.
22 Запись на диск с прямым
доступом.
Вход
AH = 22H
DS:DX
= адрес открытого FCB
Выход
AL = 0 если чтение было успешным и DTA заполнена
данными
AL
= 1 если достигнут конец файла (EOF) и чтения не было
AL
= 2 если DTA + FCB RecSize выходит за сегмент (чтения
нет)
AL
= 3 встречен EOF и считана усеченная запись (дополнена
нулями)
Описание:
приводит поля FCB CurBlk и CurRec
в соответствие с RandomRec, затем читает RecSize байт по указанному адресу в файле, помещая
считанные данные в DTA. Поле RecSize в момент вызова
должно содержать длину записи, а поле RandomRec в FCB
- номер требуемой записи.
23 Определение размера файла.
Вход
AH = 23H
DS:DX
= адрес неоткрытого FCB
Выход
AL = 0 если файл найден
Описание:
устанавливает поле RandomRec в FCB равным числу
записей размера RecSize байт, содержащихся в файле. значение RecSize
должно быть задано в момент вызова. при RecSize,
равном 1, RandomRec возвращает 4-байтовый размер
файла в байтах. Вам может оказаться проще определить размер файла через функцию
3dH Open Handle с последующей 42H Lseek Handle (при AL=2).
24 Установка номера записи для прямого доступа.
Вход
AH = 24H
DS:DX
= адрес открытого FCB
Выход
нет
Описание:
устанавливает поле RandomRec в FCB на файловый адрес,
соответствующий значениям полей CurBlk и CurRec.
25 Установка вектора прерывания.
Вход
AH = 25H
AL
= номер прерывания
DS:DX
= вектор прерывания: адрес программы обработки прерывания
Выход
нет
Описание:
устанавливает значение элемента таблицы векторов прерываний для прерывания с
номером AL равным DS:DX. это равносильно записи 4-байтового адреса в
0000:(AL*4), но, в отличие от прямой записи, DOS здесь знает, что вы делаете, и
гарантирует, что в момент записи прерывания будут заблокированы.
26 Создание программного сегмента.
Вход
AH = 26H
DX
= адрес сегмента (параграфа) для нового PSP
CS = сегмент PSP, используемого как шаблон
для нового PSP
Выход
нет
Описание:
устанавливает PSP для порождаемого процесса по адресу DX:0000.
текущий
PSP (100H байт, начиная с CS:0), копируется в DX:0
поле
MemTop соответственно корректируется
векторы
Terminate, Ctrl-Break и Critical Error копируются в PSP
из векторов прерываний INT 22H, INT 23H и INT 24H после этого вы можете
загрузить программу с диска и передать ей управление посредством FAR JMP.
27 Чтение блока записей с прямым доступом.
Вход
AH = 27H
DS:DX
= адрес открытого FCB
CX
= число считываемых записей
Выход
AL = 0 если чтение успешно и DTA заполнена данными
AL
= 1 если достигнут конец файла (EOF) и данные не
считаны
AL
= 2 если DTA + FCB (RecSize * CX) выходит за границу
сегмента
AL
= 3 если EOF и считана усеченная порция (дополнена нулями)
CX
= действительное число считанных записей
Описание:
Читает несколько записей из файла, начиная с файлового адреса,
специфицированного полем RandomRec в FCB. Помещает
данные в память, начиная с адреса DTA. число считанных
байт = FCB RecSize*CX. Поля RandomRec,
CurBlk и CurRec
корректируются, чтобы указывать на следующую запись (первую запись за прочитанными).
28 Запись блока с прямым доступом.
Вход
AH = 28H
DS:DX
= адрес открытого FCB
CX
= число записываемых записей (если CX=0, уст. размер файла)
Выход
AL = 0 если запись успешна
AL
= 1 при переполнении диска
AL
= 2 если DTA + FCB (RecSize * CX) выходит за границу
сегмента
CX
= действительное число записанных записей
Описание:
записывает несколько записей в файл, начиная с файлового адреса,
специфицированного полем RandomRec в FCB. данные
берутся из памяти, начиная с адреса DTA. число записываемых байт=(RecSize * CX). если
CX=0 при вызове, то размер файла усекается или расширяется до величины RandomRec * RecSize (никакие
данные не записываются).
29 Преобразование имени файла во внутренние параметры.
Вход
AH = 29H
DS:SI
= адрес исходной текстовой строки для разбора
ES:DI
= адрес буфера для результирующего неоткрытого FCB
AL
= битовые флаги, указывающие опции разбора (см. ниже)
Выход
AL = 0 если результирующий FCB не содержит обобщенных
символов
AL
= 1 если результирующий FCB содержит обобщенные
символы
AL
= 0ffH если неверно обозначение диска в имени файла
DS:SI = изменен: указывает на символ сразу вслед за именем файла
ES:DI
= не изменен: указывает на неоткрытый FCB
Описание:
создает неоткрытый FCB из строки текста или параметра команды.
текст, начиная с DS:SI, анализируется как имя файла в
формате D:FILENAME.EXT, и буфер по адресу ES:DI заполняется как соответственно
форматированный FCB.
Эта
функция НЕПРИМЕНИМА, если текстовая строка содержит путь.
обычно она используется для перевода в верхний регистр
и удаления точки из имени файла, введенного с клавиатуры. при этом '*'
переводится в ряд '?'. Эта функция позволяет предусмотреть умолчание в целевом
FCB (например, заранее заполнить расширение = "WKS").
Способ
разбора определяется битовыми флагами в AL:

2А Получение даты (CX-год,DН-месяц,DL-день).
Вход
AH = 2aH
Выход
AL = день недели (0=Вск, 1=Пнд,...6=Суб) DOS 3.0+
CX
= год (1980 до 2099)
DH
= месяц (1 до 12)
DL
= день (1 до 31)
Описание:
возвращает текущую дату, как она известна системе.
2В Установка даты.
Вход
AH = 2bH
CX
= год (1980 до 2099)
DH
= месяц (1 до 12)
DL
= день (1 до 31)
Выход
AL = 0 если дата корректна
Описание:
устанавливает системную дату DOS.
2С Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).
Вход
AH = 2cH
Выход
CH = часы (0 до 23)
CL
= минуты (0 до 59)
DH
= секунды (0 до 59)
DL
= сотые доли секунды (0 до 99)
Описание:
возвращает текущее время, как оно известно системе.
Замечание:
Поскольку
системные часы имеют частоту 18.2 тиков в секунду (интервал 55мс), DL имеет точность 0.04 сек.
2D Установка времени.
Вход
AH = 2dH
CH = часы (0 до 23)
CL = минуты (0 до 59)
DH = секунды (0 до 59)
DL = сотые доли секунды (0 до 99)
Выход
AL = 0 если время корректно
Описание:
устанавливает системное время DOS.
2Е Установка/отмена верификации записи на диск.
Вход
AH = 2eH
AL
= 0 отключить верификацию
=
1 включить верификацию
Выход
нет
Описание:
устанавливает, должна ли DOS верифицировать (считывать обратно) каждый сектор,
записываемый на диск. это
замедляет операции записи на диск, но гарантирует максимальную надежность
записи. функция 56H Get Verify
возвращает текущий статус верификации DOS.
Следующие расширенные функции возможны в DOS начиная с
версии 2.0:
2F Получение адреса DTA в регистровой паре ES:BX.
Вход
AH = 2fH
Выход
ES:BX = адрес начала текущей DTA
Описание:
возвращает адрес начала области ввода-вывода (DTA). Поскольку DTA глобальна для всех процессов, в рекурсивной процедуре
(например, при проходе по дереву оглавления) может потребоваться сохранить
адрес DTA, а впоследствии восстановить его посредством функции 1aH "Уст.
DTA".
Замечание:
Эта
функция изменяет сегментный регистр ES.
30 Получение номера версии DOS в регистре АХ.
Вход
AH
= 30H
Выход
AL
= старший номер версии
AH
= младший номер версии
BX,CX
= 0000H DOS 3.0+
Описание:
возвращает
в AX значение текущего номера версии DOS. например, для DOS 3.2, в AL
возвращается 3, в AH - 2.
Замечание:
если
в AL возвращается 0, можно предполагать, что работает DOS более ранней версии,
чем DOS 2.0.
Версии:
DOS
2.x не гарантирует очистки регистров CX и BX.
31 Завершение программы, после которого она остается
резидентной в
памяти.
Вход
AH = 31H
AL
= код выхода
DX
= объем памяти, оставляемой резидентной, в параграфах
Выход
нет
Описание:
выходит в родительский процесс, сохраняя код выхода в AL. код выхода можно
получить через функцию 4dH Wait. DOS устанавливает
начальное распределение памяти, как специфицировано в DX, и возвращает
управление родительскому процессу, оставляя указанную память резидентной (число
байт = DX * 16). Эта функция перекрывает функцию INT 27H, которая не возвращает
код выхода и неспособна установить резидентную
программу, большую 64K.
33 Проверка Ctrl/Break.
Вход
AH = 33H
AL
= 0 чтобы опросить текущий статус контроля Ctrl-Break
AL
= 1 чтобы установить статус контроля Ctrl-Break
DL
= требуемый статус (0=OFF, 1=ON) (только при AL=1)
Выход
DL = текущий статус (0=OFF, 1=ON)
Описание:
если AL=0, в DL возвращается текущий статус контроля Ctrl-Break.
если AL=1, в DL возвращается новый текущий статус. когда статус ON, DOS проверяет на Ctrl-Break
с консоли для большинства функций (исключая 06H и 07H). при обнаружении,
выполняется INT 23H (если оно не перехватывется, то
это снимает процесс). когда статус OFF, DOS проверяет на Ctrl-Break
лишь при операциях стандартного в/в,
стандартной печати и стандартных операциях AUX.
35 Получение вектора прерывания (адреса подпрограммы).
Вход
AH = 35H
AL
= номер прерывания (00H до 0ffH)
Выход
ES:BX = адрес обработчика прерывания
Описание:
возвращает значение вектора прерывания для INT (AL); то есть, загружает в BX
0000:[AL*4], а в ES - 0000:[(AL*4)+2].
Предупреждение:
Эта
функция изменяет сегментный регистр ES.
36 Получение размера свободного пространства на диске.
Вход
AH = 36H
DL
= номер диска (0=текущий, 1=A, и т.д.)
Выход
AX = 0ffffH, если AL содержал неверный номер диска или число секторов на
кластер, если нет ошибок.
BX
= доступных кластеров.
CX
= байт на сектор.
DX
= всего кластеров на диске.
Описание:
возвращает данные для подсчета общей и доступной дисковой памяти. если в AX возвращено 0ffffH,
значит, вы задали неверный диск. Иначе, свободная память в байтах = (AX * BX *
CX) всего памяти в байтах = (AX * CX * DX)
38 Получение государственно зависимых
форматов.
Вход
AH = 38H
DX
= 0ffffH чтобы установить код страны равным AL (или BX)
DS:DX
= адрес локального буфера для чтения блокa
данных страны
AL
= 0 чтобы получить данные для текущей страны
=
1 до 0feH чтобы получить данные для указанной страны < 255
=
0ffH чтобы получить данные для кода страны ‡ 255
BX
= (если AL=0ffH) 16-битовый код страны
Выход
AX = код ошибки если флаг CF установлен
BX
= код страны (если AL=0 при входе)
Описание:
если DX=0ffffH, то текущий код страны (см. ниже) устанавливается равным AL
(если AL=0ffH, то код страны устанавливается равным BX).
обычно код страны устанавливается в файле CONFIG.SYS.
если DX < 0ffffH, то DS:DX адресует буфер пользователя, в который помещается
20-байтовый блок данных страны для указанной страны.
Замечание:
адрес
вызова CaseMap можно использовать для определения
сопоставляющей (сортирующей) последовательности символов в разных алфавитах.
Версии:
DOS
2.x не позволяет устанавливать код страны. В этом случае параметры вызова
проще:
Вход
AL=0
DS:DX
= адрес 20-байтового локального буфера
Выход
Пересылает
в DS:DX блок данных страны для DOS 2.x
Hex Dec страна Keybrd дата
время формат валюты DS
3dH
061 Австралия DD-MM-YY 13:00:00
$1,000.00 ,
20H
032 Бельгия DD/MM/YY 13:00:00 1 000,00 F ;
2
002 Французская Канада YY-MM-DD
13:00:00 1 000,00 $ ;
2dH
045 Дания DD/MM/YY 13.00:00 1.000,00 DKR ;
166H
358 Финляндия DD-MM-YY 13:00:00 1 000,00 MK ;
21H
033 Франция keybFR DD/MM/YY
13:00:00 1 000,00 F ;
31H
049 Германия keybGR DD.MM.YY
13.00.00 DM1.000,00 ;
27H
039 Италия keybIT DD/MM/YY
13:00:00 1.000,Lit. ;
3ccH
972 Израиль DD/MM/YY 13:00:00
Щ 1,000.00 ,
311H 785
Средний Восток
DD/MM/YY 01:00:00 PM 1.000,000 $ ;
1fH
031 Нидерланды DD-MM-YY 13:00:00
Я1.000,00 ;
2fH
047 Норвегия DD/MM/YY 13.00.00
KR 1.000,00
;
15fH
351 португалия DD/MM/YY 13:00:00 1.000$00 ;
22H
034 Испания keybSP DD/MM/YY
13:00:00 1.000,00 Ю ;
2eH
046 Швеция YY-MM-DD 13.00.00
SEK 1.000,00
;
29H
041 Швейцария DD.MM.YY 13.00.00
Fr 1,000.00 ,
2cH
044 Великобритания keybUK DD-MM-YY
13:00:00 Ь1,000.00 ,
1
001 Соединенные Штаты MM-DD-YY
01:00:00 PM $1,000.00 ,
39 Создание подкаталога (команда MKDIR).
Вход
AH = 39H
DS:DX
= адрес строки ASCIIZ с именем оглавления
Выход
AX = код ошибки если CF установлен
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяоглавл",0
если диск и/или корневой путь опущены, то принимаются
по умолчанию. Подоглавление создается и связывается с существующим деревом. если флаг CF установлен при
возврате, то AX содержит код ошибки, и оглавление не создается.
ЗА Удаление подкаталога (команда RMDIR).
Вход
AH = 3aH
DS:DX
= адрес строки ASCIIZ с именем оглавления
Выход
AX = код ошибки если CF установлен
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяоглавл",0.
если диск и/или корневой путь опущены, то принимаются
по умолчанию. Подоглавление удаляется из структуры оглавления.
если флаг CF установлен при возврате, то AX содержит
код ошибки, и оглавление не удаляется.
Замечание:
оглавление
не должно содержать файлов и подоглавлений и не должно быть связано возможными
ограничениями DOS (например, не должно быть задействовано в активных командах
JOIN или SUBST).
3В Установка текущего каталога (команда CHDIR).
Вход
AH = 3bH
DS:DX
= адрес строки ASCIIZ с именем оглавления
Выход
AX = код ошибки если CF установлен
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяоглавл",0.
если диск и/или корневой путь опущены, то принимаются по умолчанию. указанное подоглавление для
указанного диска становится текущим (умалчиваемым) оглавлением DOS для этого
(или текущего) диска. если флаг CF установлен при возврате, то AX содержит код
ошибки, и текущее оглавление для выбранного диска не изменяется.
3C Создание файла без использования FCB .
Вход
AH = 3cH
DS:DX
= адрес строки ASCIIZ с именем файла
CX
= атрибут файла
Выход
AX = код ошибки если CF установлен и описатель файла
если ошибки нет
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0.
если диск и/или путь опущены, они принимаются по умолчанию.
файл
создается в указанном (или умалчиваемом) оглавлении
файл
открывается в режиме доступа чтение/запись
вы
должны созранить описатель (handle)
для последующих операций
если
файл уже существует:
при
открытии файл усекается до нулевой длины
если
атрибут файла - только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
CONFIG.SYS
специфицирует число доступных описателей в системе
используйте
функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать)
существующий файл.
3D Открытие файла без использования FCB.
Вход
AH = 3dH
DS:DX
= адрес строки ASCIIZ с именем файла
AL
= режим открытия
Выход
AX = код ошибки если CF установлен и описатель файла
если нет ошибки.
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0.
Если диск и/или путь опущены, они принимаются по умолчанию.
файл
должен существовать. См. функцию 3cH (создать файл).
файл
открывается в выбранном режиме доступа / режиме открытия для совместимости с
DOS 2.x и избежания сетевых режимов, задавайте:
AL
= 0 чтобы открыть для чтения
AL
= 1 чтобы открыть для записи
AL
= 2 чтобы открыть для чтения и записи
указатель
чтения/записи устанавливается в 0. См. 42H (LSEEK)
вы
должны сохранить описатель (handle) для последующих
операций
разделение
файлов должно быть активизировано (команда DOS SHARE), если запрашивается
открытие в одном из режимов разделения.
CONFIG.SYS
специфицирует число доступных описателей файлов.
3E Закрытие файла без использования FCB.
Вход
AH = 3eH
BX
= описатель файла
Выход
AX = код ошибки если CF установлен
Описание:
BX содержит описатель файла (handle), возвращенный
при открытии. файл,
представленный этим описателем, закрывается, его буфера сбрасываются, и
оглавление обновляется корректными размером, временем и датой. Из-за нехватки
описателей файлов (максимум 20, по умолчанию 8), вам может понадобиться закрыть
часть умалчиваемых описателей, как, например, описатель 3 (стандартный AUX).
3F Чтение из файла или ввод с устройства.
Вход
AH = 3fH
BX
= описатель файла
DS:DX
= адрес буфера для чтения данных
CX
= число считываемых байт
Выход
AX = код ошибки если CF установлен или число
действительно прочитанных байт
Описание:
CX байт данных считываются из файла или устройства с описателем, указанным в
BX. данные читаются с текущей позиции указателя чтения/записи файла и
помещаются в буфер вызывающей программы, адресуемый через DS:DX. Используйте
функцию 42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN
сбрасывает указатель в 0). Модифицирует указатель чтения/записи файла,
подготавливая его к последующим операциям чтения или записи.Вы должны всегда сравнивать возвращаемое значение AX
(число прочитанных байт) с CX (запрошенное число байт):
если
AX = CX, (и CF сброшен) - чтение было корректным без
ошибок
если
AX = 0, достигнут конец файла (EOF)
если
AX < CX (но ненулевой):
при
чтении с устройства - входная строка имеет длину AX байт
при
чтении из файла - в процессе чтения достигнут EOF
Замечания:
Эта
функция превосходит сложные и неудобные FCB-функции.
Она эффективно сочетает произвольный и последовательный доступ, позволяя
пользователю выполнять свое собственное блокирование. Удобно использовать эту
функцию для чтения стандартных описателей, таких как описатели стандартного в/в, взамен многочисленных буферизующих и посимвольных
FCB-функций ввода. Когда вы читаете с устройства, AX возвращает длину считанной
строки с учетом завершающего возврата каретки CR (ASCII 0dH).
40 Запись в файл или вывод на устройство.
Вход
AH = 40H
BX
= описатель файла
DS:DX
= адрес буфера, содержащего записываемые данные
CX
= число записываемых байт
Выход
AX = код ошибки если CF установлен
AL = число реально считанных байт (лучший
тест для ошибок)
Описание:
CX байт данных записывается в файл или на устройство с описателем, заданным в
BX. данные берутся из буфера, адресуемого через DS:DX. данные записываются,
начиная с текущей позиции указателя чтения/записи файла. Используйте функцию
42H LSEEK, чтобы установить указатель файла, если необходимо (OPEN сбрасывает
указатель в 0). Обновляет указатель чтения/записи файла, чтобы подготовиться к
последующим операциям последовательного чтения или записи. Вы должны всегда
сравнивать возвращаемое значение AX (число записанных
байт) с CX (запрошенное число байт для записи).
если
AX = CX, запись была успешной
если
AX < CX, встретилась ошибка (скорее всего, переполнение)
Замечание:
Эта
функция превосходит сложные и неудобные FCB-функции.
Она эффективно сочетает произвольный и последовательный доступ, позволяя
пользователю осуществлять собственное блокирование. Удобно использовать эту
функцию для вывода на умалчиваемые устройства, такие как стандартный вывод,
взамен использования различных функций вывода текста.
41 Удаление файла из каталога.
Вход
AH = 41H
DS:DX
= адрес строки ASCIIZ с именем файла
Выход
AX = код ошибки если CF установлен
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0.
Если диск и/или путь опущены, они принимаются по умолчанию. имя файла не может
содержать обобщенные символы ('?' и '*'). файл удаляется из заданного оглавления заданного диска. если
файл имеет атрибут только чтение, то перед удалением необходимо изменить этот
атрибут через функцию 43H CHMOD.
42 Установка позиции для последовательного доступа
(гл.17).
Вход
AH = 42H
BX
= описатель файла
CX:DX
= на сколько передвинуть указатель: (CX * 65536) + DX
AL
= 0 переместить к началу файла + CX:DX
AL
= 1 переместить к текущей позиции + CX:DX
AL
= 2 переместить к концу файла + CX:DX
Выход
AX = код ошибки если CF установлен
DX:AX
= новая позиция указателя файла (если нет ошибки)
Описание:
перемещает логический указатель чтения/записи к нужному адресу. Очередная
операция чтения или записи начнется с этого адреса.
Замечение:
Вызов
с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее
слово: действительная длина (DX * 65536) + AX.
43 Изменение атрибутов файла.
Вход
AH = 43H
DS:DX
= адрес строки ASCIIZ с именем файла
AL
= код подфункции: 0 = извлечь текущий атрибут файла
AL
= 1 = установить атрибут файла
CX
= новый атрибут файла (для подфункции 01H)
Выход
AX = код ошибки если CF установлен
CX
= текущий атрибут файла (для подфункции 00H)
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0.
Если диск и/или путь опущены, они принимаются по умолчанию.
атрибут файла извлекается или устанавливается,
согласно коду в AL.
Замечание:чтобы спрятать оглавление, используйте CX=02H (а не 12H, как вы,
возможно, ожидали).
44 Управление вводом-выводом для различных устройств.
Вход
AH = 43H
AL
= код подфункции:
AL
= 00H - дать информацию устр-ва
AL
= 01H - уст. информацию устр-ва
AL
= 02H - читать с симв. устр-ва
AL
= 03H - писать на симв. устр-во
AL
= 04H - читать с блочного устр.
AL
= 05H - писать на блочное устр.
AL
= 06H - дать статус ввода
AL
= 07H - дать статус вывода
AL
= 08H - запрос съемн носителя
AL
= 09H - запрос лок/удал устр-ва
AL
= 0aH - запрос лок/удал описателя
AL
= 0bH - счет повторов разделения
AL
= 0cH - (зарезервировано)
AL = 0dH - общий IOCTL [DOS 3.2+]
AL
= 0eH - дать логич устр-во
[DOS 3.2+]
AL
= 0fH - уст логич устр-во
[DOS 3.2+]
прочие
= (в зависимости от подфункции)
Выход
AX = код ошибки если CF установлен или иное значение
(в зависимости от подфункции)
Описание:
IOCTL предоставляет метод взаимодействия с устройствами и получения информации
о файлах. входные параметры и
выходные значения варьируются в зависимости от кода подфункции в регистре AL.
Версии:
подфункции
0-7 ............ DOS 2.1+
подфункции
8,0bH .......... DOS 3.0+
подфункции
9,0aH .......... DOS 3.1+
подфункции
0dH,0eH,0fH .... DOS 3.2+
Подфукция 00H: Запросить флаги информации об
устройстве
вход:
BX= описатель файла (устройство или дисковый файл)
выход:
DX= IOCTL Инф об устр
Подфукция 01H: установить флаги информации об
устройстве
вход:
BX
= описатель файла (устройство или дисковый файл)
DX
= IOCTL Инф об устр (DH
должен быть нулевым)
выход:
DX= IOCTL Инф об устр
Подфукция 02-03: читать (AL=02H) или писать (AL=03H)
строку IOCTL на СИМВОЛЬНОЕ устр
вход:
DS:DX
= адрес буфера (чтение) или данных (запись)
CX=
число передаваемых байт
BX=
описатель файла (только устройство -- не файл!)
выход:
AX= код ошибки если CF установлен
Подфукция 04-05: читать (AL=04H) или писать (AL=05H)
строку IOCTL на БЛОЧНОЕ устр
вход:
DS:DX
= адрес буфера (чтение) или данных (запись)
CX
= число передаваемых байт
BL
= ID диска (0=текущий, 1=A, и т.д.)
выход:
AX
= код ошибки если CF установлен
AX
=действительное число переданных байт (если CF=NC=0)
Подфукция 06-07: дать статус ввода (AL=06H) или статус
вывода (AL=07H)
вход:
BX= описатель файла (устройство или дисковый файл)
выход:
AL=
0ffH=не конец файла; 0=EOF (для дисковых описателей)
AL=
0ffH=готово; 0=не готово (для устройств)
Подфукция 08H: использует ли блочное устройство
съемный носитель? [DOS 3.0+]
вход:
BL= ID диска (0=текущий, 1=A, и т.д.)
выход:
AX
= 00H - съемный носитель (т.е. флоппи-диск)
AX
= 01H - не съемный (твердый диск или RAM-диск)
AX
= 0fH - код ошибки если BL содержит неверный диск
Подфукция 09H: Является ли устройство съемным в сети?
[DOS 3.1+]
вход:
BL = ID диска (0=текущий, 1=A, и т.д.)
выход:
DX = атрибут устройства для диска. если
бит 12=1 (т.е., DX & 1000H = 1000H), то устройство съемное.
Подфукция 0aH: принадлежит ли описатель файла
локальному или удаленному устройству в сети? [DOS 3.1+] Нам посоветовали не
использовать эту подфункцию. Вместо этого трактуйте удаленные устройства как
локальные.
вход:
BX = описатель файла (только устройство -- не файл)
выход:
DX = атрибут устройства для диска. если
бит 15=1 (т.е., DX & 8000H = 8000H), то устройство удаленное.
Подфукция 0bH: контроль повтора/задержки при
разделении и блокировке файлов. 3.0+
вход:
DX=
число попыток перед вызовом INT 24H "Критическая ошибка"
CX=
счетчик цикла между попытками
выход:
AX= код ошибки если CF установлен
замечание:
умолчание - 3 попытки и счетчик цикла 1.
Подфукция 0dH: Общий вызов IOCTL отрабатывает
разнообразные функции управления. Начиная с DOS 3.2, можно создавать драйверы
устройств, работающие на уровне дорожек (форматирование, чтение/запись). [DOS
3.2+] Код действия в регистре CL определяет "подподфункцию":
вход:
CL
= код действия
40H
= установить параметры устройства
60H
= дать параметры устройства
41H
= писать дорожку логического устройства
61H
= читать дорожку логического устройства
42H
= форматировать дорожку с верификацией
62H = Верифицировать дорожку логического устройства
DS:DX=>
адрес пакета данных IOCTL
выход:
AX=
код ошибки если CF установлен
DS:DX=>
пакет данных может содержать информацию возврата.
Подфукция 0eH: Выяснить, назначил ли драйвер
устройства несколько логических устройств одному физическому устройству. [DOS
3.2+]
вход:
BL= ID диска (0=текущий, 1=A, и т.д.)
выход:
AX= код ошибки если CF установлен
AL
= 0 если ровно одна буква диска назначена устройству BL
AL
= (1=A, 2=B и т.д.) если назначено несколько логических устройств, AL содержит
ID текущего назначенного диска
Подфукция 0fH: Сообщить драйверу блочного устройства
ID устройства для обработки. когда
с физическим устройством ассоциируется несколько логических, DOS выдает
сообщение "Insert diskette
for drive X:...". Эта
функция позволяет вам сообщать DOS, что диск с указанным ID уже установлен, тем
самым обходя сообщение. [DOS 3.2+]
вход:
BL= ID диска (0=текущий, 1=A, и т.д.)
выход:
AX=
код ошибки если CF установлен
AL
= 0 если ровно один ID назначен устройству BL
AL
= (1=A, 2=B и т.д.) ID выбранного устройства, которое будет использоваться в
последующих операциях в/в.
Замечание:
Эта функция должна вызываться перед любой операцией в/в
на логическом устройстве. Иначе DOS может выдать сообщение.
45 Дублирование файлового номера.
Вход
AH = 45H
BX
= существующий описатель файла
Выход
AX = новый описатель файла, дублирующий оригинал или код ошибки
если CF установлен.
Описание:
Создает дополнительный описатель файла, ссылающийся на тот же поток в/в, что и существующий описатель. Любое продвижение указателя
чтения/записи для одного описателя действует на его дубликат
-- включая любые операции чтения, записи или перемещения указателя
посредством функции 42H LSEEK. Новый описатель наследует ограничения режима
открытия оригинала. Эта функция используется с одной главной целью: вы можете
закрыть описатель, заставляя DOS записать файловые буфера.
такой способ DUP/CLOSE - быстрее, чем закрытие и
повторное открытие файла.
46 "Склеивание" дублированных файловых
номеров.
Вход
AH = 46H
BX
= целевой описатель файла (должен уже существовать)
CX
= исходный описатель файла (должен уже существовать)
Выход
AX = код ошибки если CF установлен
Описание:
Заставляет описатель файла (handle) ссылаться на
другой файл или устройство. описатель
в CX (источник) закрывается, если он открыт, а затем становится дубликатом
описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться
на один и тот же физический файл или устройство.
используется
для переназначения стандартного в/в. пример:
Откроем
файл "C:\STDOUT.TXT" через функцию 3dH Open
File и получим описатель (например, 05).
установим
BX=05, CX=01 и вызовем эту функцию. (замечание: описатель 01 - это
предопределенный описатель "стандартного выходного устройства").
Теперь
можно вызвать функцию 3eH Close File
и закрыть handle 05. можно обращаться к файлу
STDOUT.TXT через описатель 01.
Стало
быть, дисковый файл "C:\STDOUT.TXT" будет отныне получать
весь вывод, создаваемый всеми процессами (текущим и порожденными) через любую
функцию символьного в/в DOS, так же как и любой вывод в описатель файла 01
через функцию DOS 40H.
когда
вы выходите в COMMAND.COM, предопределенные описатели устанавливаются на
обычные устройства (например, описатель 01 устанавливается на "CON").
47 Получение текущего каталога.
Вход
AH = 47H
DS:SI
= адрес локального буфера для результирующего пути (64 байта)
DL
= номер диска (0=текущий, 1=A, и т.д.)
Выход
AX = код ошибка если CF установлен
Описание:
В пользовательский буфер по адресу DS:SI помещается в форме ASCIIZ путь
текущего умалчиваемого оглавления для диска, указанного в DL. Путь возвращается
в формате: "путь\оглавление",0. Не
подставляется впереди буква диска, а сзади не подставляется символ
"\". например, если
текущим является корневое оглавление, эта функция вернет вам пустую строку
(DS:[SI] = 0).
48 Выделение памяти из свободного пространства.
Вход
AH = 48H
BX
= запрошенное количество памяти в 16-байтовых параграфах
Выход
AX = код ошибки если CF установлен
BX
= размер доступной памяти в параграфах (если памяти нехватает)
AX
= сегментный адрес распределенного блока (если нет ошибок)
Описание:
распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого
блока в AX (блок начинается с AX:0000). если распределение неудачно, взводится Carry-флаг, в AX
возвращается код ошибки, а BX содержит максимальный размер доступной для
распределения памяти (в параграфах).
Чтобы
определить наибольший доступный кусок, общепринято устанавливать
BX=0ffffH перед вызовом. распределение завершится с ошибкой, возвратив размер
максимального блока памяти в BX.
Замечание:
когда
процесс получает управление через функцию 4bH EXEC, вся доступная память уже
распределена ему.
49 Освобождений выделенной памяти.
Вход
AH = 49H
ES
= сегментный адрес (параграф) освобождаемого блока памяти
Выход
AX = код ошибки если CF установлен
Описание:
Освобождает блок памяти, начинающийся с адреса ES:0000. этот блок становится
доступным для других запросов системы. Вообще говоря, вы должны освобождать
лишь те блоки памяти, которые вы получили через функцию 48H распределить
память. Родитель отвечает за освобождение памяти порожденных процессов. Тем не
менее, ничто не препятствует вам освобождать память чужих
проыессов.
4А Изменение длины блока выделенной памяти.
Вход
AH = 4aH
ES
= сегмент распределенного блока памяти
BX
= желаемый размер блока в 16-байтовых параграфах
Выход
AX = код ошибки если CF установлен
BX
= наибольший доступный блок (если расширение неудачно)
Описание:
Изменяет размер существующего блока памяти. Когда программа получает
управление, функция 4bH EXEC уже распределила блок памяти, начиная с PSP,
который содержит всю доступную память. чтобы освободить память для запуска порождаемых процессов,
блок памяти, начинающийся с PSP, необходимо сначала сжать.
Замечание:
функция
31H (KEEP) и INT 27H (TSR) сжимают блок по адресу PSP.
4В Загрузка/выполнение программы (подпроцесса).
Вход
AH = 4bH
DS:DX
= адрес строки ASCIIZ с именем файла, содержащего программу
ES:BX = адрес EPB (EXEC Parameter
Block - блока параметров EXEC)
AL
= 0 = загрузить и выполнить
AL
= 3 = загрузить программный оверлей
Выход
AX = код ошибки если CF установлен
Описание:
предоставляет средства одной программе (родителю) вызвать другую программу
(ребенка), которая по завершению возвратит управление родителю.DS:DX
указывает на строку ASCIIZ в форме: "d:\путь\имяфайла",0. если диск
или путь опущены, они подразумеваются по умолчанию. ES:BX указывает на блок
памяти, подготовленный как EPB, формат которого зависит от запрошенной
подфункции в AL. AL=0 EXEC: так как родительская программа первоначально
получает всю доступную память в свое распоряжение, вы должны освободить часть
памяти через функцию 4aH до вызова EXEC (AL=0). обычная последовательность: Вызовите функцию 4aH с ES=сегменту PSP и BX=минимальному
объему памяти, требуемой вашей программе (в параграфах). Подготовьте строку
ASCIIZ с именем вызываемого программного файла и установите DS:DX на первый
символ этой строки. Подготовьте блок параметров EXEC со всеми необходимыми
полями. Сохраните текущие значения SS, SP, DS, ES и DTA в переменных,
адресуемых через регистр CS (CS - это единственная точка для ссылок после того,
как EXEC вернет управление от ребенка). Выдайте вызов EXEC с AL=0. Восстановите
локальные значения SS и SP. Проверьте флаг CF, чтобы узнать, не было ли ошибки
при EXEC. Восстановите DS, ES и локальную DTA, если необходимо. Проверьте код
выхода через функцию 4dH WAIT (если надо).
Все
открытые файлы дублируются, так что ребенок может обрабатывать данные как через описатели файлов, так и через стандартный
в/в. режимы доступа описателей дублируются, но любые активные блокировки файлов
не будут относиться к ребенку. См. функцию 5cH. после возврата из ребенка,
векторы INT 22H Terminate, INT 23H Ctrl-Break и INT 24H Critical Error восстанавливаются в их предыдущие значения.
AL=3
LOAD: Эта подфункция используется для загрузки "оверлея".
DS:DX
указывает на ASCIIZ имя файла, а ES:BX указывает на "LOAD"-версию
блока параметров EXEC. Главное значение этой подфункции в том, что она
считывает заголовок EXE и выполняет необходимые перемещения сегментов, как это
требуется для программ .EXE.
Замечания:
Эта
функция использует программу-загрузчик из
COMMAND.COM, который транзитен
в DOS 2.x (и, возможно, уже перекрыт программой). В этом случае возникнет
ошибка, если DOS не найдет файл COMMAND.COM. Вы должны обеспечить корректную
строку COMSPEC= в окружении перед вызовом этой функции.
Вместо
разбора собственных FCB (как требуется для EPB), вы
можете найти удобным загрузить и выполнить вторичную копию файла COMMAND.COM,
используя опцию /C. например, чтобы выполнить программу FORMAT.COM, установите
DS:DX на адрес строки ASCIIZ: "\command.com",0 и установите EPB+2 на
сегмент и смещение следующей строки команд: 0eH,"/c
format a:/s/4",0dH такой вторичный интерпретатор команд
использует очень мало памяти (около 4K). Вы можете поискать в окружении DOS
строку COMSPEC=, чтобы установить точное местоположение файла COMMAND.COM.
4С Завершение подпроцесса с
возвратом управления.
Вход
AH = 4cH
AL
= код выхода
Выход
нет
Описание:
возвращает управление от порожденного процесса его родителю, устанавливая код
выхода, который можно опросить функцией 4dH WAIT. Управление передается по
адресу завершения в PSP завершающейся программы. векторы Ctrl-Break и Critical Error восстанавливаются
к старым адресам, сохраненнмы в родительском PSP.
Замечание:
значение
ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки
кода выхода самой последней программы.
4D Получение кода завершения подпроцесса.
Вход
AH = 4dH
Выход
AL = код выхода последнего завершившегося процесса
AH
= 0 - нормальное завершение
AH
= 1 - завершение через Ctrl-Break
AH
= 2 - завершение по критической ошибке устройства
AH
= 3 - завершение через функцию 31H KEEP
Описание:
возвращает код выхода последнего из завершившихся процессов. Эта функция
возвращает правильную информацию только однажды для каждого завершившегося
процесса.
4Е Начальный поиск файла по шаблону.
Вход
AH = 4fH
DS:DX
= адрес строки ASCIIZ с именем файла (допускаются ? и
*)
CX
= атрибут файла для сравнения
Выход
AX = код ошибки если CF установлен
DTA
= заполнена данными (если не было ошибки)
Описание:
DS:DX указывает на строку ASCIIZ в форме: "d:\путь\имяфайла",0. Если
диск и/или путь опущены, они подразумеваются по умолчанию. Обобщенные символы *
и ? допускаются в имени файла и расширении. DOS
находит имя первого файла в оглавлении, которое совпадает с заданным именем и
атрибутом, и помещает найденное имя и другую информацию в DTA, как показано
ниже:

Замечания:
Атрибут
файла обычно используется во "включающем" поиске.
если вас интересуют как файлы, так и оглавления,
установите бит атрибута 4 (т.е. attr | 10H). См.
атрибут файла для полной информации.
Типичная
последовательность, используемая для поиска всех подходящих файлов:
используйте вызов
1aH, чтобы установить DTA на локальный буфер (или используйте умалчиваемую DTA в PSP по смещению 80H)
уст. CX=атрибут,
DS:DX => ASCIIZ диск, путь, обобщенное имя
вызовите функцию 4eH (Найти 1-й)
если флаг CF указывает ошибку, вы закончили
(нет совпадений)
уст. DS:DX => DTA (или на данные, которые
вы скопировали из DTA после вызова функции 4eH)
повторять
обработать
имя файла и данные по адресу DS:DX
вызвать
функцию 4fH (Найти следующий)
пока
Carry-флаг не покажет, что совпадений больше нет
4F Поиск следующего файла по шаблону.
Вход
AH = 4fH
DS:DX
= адрес данных, возвращенных предыдущей 4eH Найти 1-й
файл
Выход
AX = код ошибки если CF установлен
DTA
= заполнена данными
Описание:
DS:DX указывает на 2bH-байтовый буфер с информацией, возвращенной функцией 4eH Найти 1-й (либо DTA, либо буфер, скопированный из DTA). Используйте
эту функцию после вызова 4eH. следующее имя файла, совпадающее по обобщенному
имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой
информацией (см. функцию 4eH о структуре файловой информации в буфере,
заполняемом DOS).
54 Получение состояния верификации.
Вход
AH = 54H
Выход
AL = 0 если верификация выключена (OFF)
AL
= 1 если верификация включена (ON)
Описание:
Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то
DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить
правильность записи. функция
DOS 2eH позволяет установить/изменить режим верификации.
56 Переименование файла.
Вход
AH = 56H
DS:DX
= адрес старого ASCIIZ имени (путь/имя существующего файла)
ES:DI
= адрес нового ASCIIZ имени (новые путь/имя)
Выход
AX = код ошибки если CF установлен
Описание:
DS:DX и ES:DI указывают на строки ASCIIZ: "d:\путь\имяфайла",0.
Старое имя DS:DX должно отвечать существующему файлу и не может содержать
обобщенных символов. диск и
путь необязательны (если опущены, они принимаются по умолчанию). Новое имя
ES:DI должно описывать НЕ существующий файл. если указан диск, он должен быть тем же, что и в старом
имени. если диск или путь опущены, принимаются текущие умолчания. Если старое и
новое имя содержат разные пути (явно или принятые по умолчанию), то элемент
оглавления для файла ПЕРЕМЕЩАЕТСЯ в оглавление, указанное в новом имени.
Замечание:
если
ID диска в старом имени отличается от текущего диска DOS, не забывайте
указывать такой же ID диска в новом имени.
57 Получение/установка даты и времени изменения файла.
Вход
AH = 57H
AL
= 0 чтобы получить дату/время файла
=
1 чтобы установить дату/время файла
BX
= описатель файла (handle)
CX
= (если AL=1) новая отметка времени в формате время/дата файла
DX
= (если AL=1) новая отметка даты в формате время/дата файла
Выход
AX = код ошибки если CF установлен
CX
= отметка времени файла в формате время/дата файла
DX
= отметка даты файла в формате время/дата файла
Описание:
BX должен содержать описатель открытого файла (см. 3cH или 3dH ). Укажите подфункцию, 0 или 1, в регистре AL. DX и CX
задаются в формате памяти; например, младшие 8 бит даты находятся в DH.
Следующие расширенные функции возможны в DOS начиная с
версии 3.0:
59 Получение расширенного кода ошибки.
Вход
AH = 59H DOS 3.0+
BX
= 0000H (номер версии: 0000H для DOS 3.0, 3.1 и 3.2)
Выход
AX = расширенный код ошибки (0, если не было ошибки)
BH
= класс ошибки
BL
= предлагаемое действие
CH
= сфера (где произошла ошибка)
Описание:
используйте эту функцию, чтобы уточнить, что предпринять после сбоя функции DOS
по ошибке (только DOS 3.0+ ). вызывайте
ее:
в
обработчике критических ошибок INT 24H
после
любой функции INT 21H , возвратившей Carry-флаг
после
вызова FCB-функции, возвратившей AL=0ffH
5А Создание временного файла.
Вход
AH = 5aH DOS 3.0+
DS:DX
= адрес строки ASCIIZ с диском и путем (заканчивается \)
CX
= атрибут файла
Выход
AX = код ошибки если CF установлен и описатель файла
(если нет ошибки)
DS:DX
= (не изменяется) становится полным ASCIIZ-именем нового файла
Описание:
открывает (создает) файл с уникальным именем в оглавлении, указанном строкой
ASCIIZ, на которую указывает DS:DX. COMMAND.COM использует эту функцию, когда
создает временные "канальные" файлы, используемые при переназначении
ввода-вывода. Описание пути должно быть готово к присоединению в его конец
имени файла. Вы должны обеспечить минимум 12 байт в конце строки. Сама строка
должна быть заполнена в одной из форм:
"d:\путь\",0
(указаны диск и путь)
ИЛИ
"d:",0 (умалчиваемое оглавление диска)
ИЛИ
"d:\",0 (корневое оглавление диска)
ИЛИ
"",0 (умалчиваемые диск и оглавление)
После
возврата строка DS:DX будет дополнена именем файла.
Замечания:
DOS
создает имя файла из шестнадцатеричных цифр, получаемых из текущих даты и
времени. если имя файла уже
существует, DOS продолжает создавать новые имена, пока не получит уникальное
имя. создаваемые таким способом файлы - по существу НЕ ВРЕМЕННЫЕ, и их следует
удалять посредством функции DOS 41H , когда они не нужны.
Версии:
доступна,
начиная с DOS 3.0
5В Создание нового файла.
Вход
AH = 5bH DOS 3.0+
DS:DX
= адрес строки ASCIIZ с именем файла
CX
= атрибут файла
Выход
AX = код ошибки если CF установлен и описатель файла
если ошибок нет
Описание:
DS:DX указывает на строку ASCIIZ в форме: "d:\путь\имяфайла",0. Если
диск и/или путь опущены, они принимаются по умолчанию. Этот вызов идентичен
функции DOS 3cH CREATE, с тем исключением, что он вернет ошибку, если файл с
заданным именем уже существует. Файл открывается для чтения/записи в
совместимом режиме доступа
5С Блокирование/разблокирование доступа к файлу.
Вход
AH = 5cH DOS 3.0+
AL
= подфункция: 0 = заблокировать область файла
=
1 = разблокировать ранее захваченную область
BX
= описатель файла (handle)
CX:DX
= смещение ((CX * 65536) + DX) от начала файла
SI:DI
= длина блокируемой области ((SI * 65536) + DI) байт
Выход
AX = код ошибки если CF установлен
Описание:
блокирует или освобождает доступ к участку файла, идентифицируемого описателем
в BX. область файла, начинающаяся по логическому смещению CX:DX и имеющая длину SI:DI, блокируется (захватывается) или разблокируется (освобождается). смещение и длина обязательны. Разделение файлов ДОЛЖНО быть
активизировано (командой SHARE), иначе функция вернет код ошибки "неверный
номер функции." Блокировка действует на операции чтения, записи и открытия
со стороны порожденного или конкурирующего процесса. при попытке такого доступа
(и режиме доступа , определенном при OPEN как
"режим разделения", который запрещает такой доступ), DOS отвергает
операцию через вызов INT 24H (обработчик критических ошибок) после трех
попыток. DOS при этом выдает сообщение "Abort, Retry, Ignore". Рекомендуемое
действие - НЕ пытаться читать файл и ожидать кода ошибки. Вместо этого
попытайтесь заблокировать область и действуйте в соответствии с кодом возврата. это позволяет избежать довольно
неустойчивого состояния DOS, связанного с выполнением INT 24H. Блокировка за
концом файла не является ошибкой. Вы можете захватить весь файл, задав CX=0,
DX=0, SI=0ffffH, DI=0ffffH и AL=0. при освобождении, смещение и длина участка
должны точно совпадать со смещением и длиной захваченного участка.
Замечания:
Дублирование
описателя через 45H или 46H дублирует и блокировки. Даже если во время OPEN
выбран режим доступа Inherit, механизм блокировки не
даст никаких привилегий доступа порожденным процессам, созданным функцией 4bH
EXEC (они трактуются как отдельные). Важно, чтобы все блокировки файла были
сняты до завершения программы. если
вы используете блокировку, особо отслеживайте вызовы INT 23H (выход Ctrl-Break) и INT 24H (выход по критической ошибке), чтобы
снять блокировки до действительного завершения программы. Рекомендуется
освобождать блокировки как можно скорее. всегда блокируйте, обрабатывайте файл и освобождайте
блокировку одной операцией.
62 Получение адреса префикса программного сегмента
(PSP).
Вход
AH = 62H DOS 3.0+
Выход
BX = сегментный адрес PSP выполняющейся программы
Описание:
Эта функция возвращает в BX адрес PSP текущей программы.
используется, чтобы получить адрес параметров
командной строки, адрес окружения DOS и другой полезной информации в PSP.