
Dos7book
.pdf
Глава 8: Вызовы обработчиков прерываний
результат покажет, произведено ли перенаправление на самом деле и не исчерпано ли уже все содержимое файла.
При вызове: |
|
AH |
= 0Bh |
При возврате: |
|
AL |
= 00h, если канал STDIN пуст, или |
AL |
= FFh, если в канале STDIN имеется хотя бы один байт. |
Примечание 1: функция INT 21\AH=0Bh проверяет состояние флага, взводимого клавишными комбинациями CTRL-C и CTRL-Break (8.01-95). Если окажется, что этот флаг взведен, то будет вызван обработчик прерывания INT 23.
8.02-08 INT 21\AH=0Ch – очистить буфер клавиатуры и считать знак
Обработчик прерывания INT 21\AH=0Ch используется для того, чтобы очистить буфер клавиатуры, а затем автоматически вызвать любую функцию из числа INT 21\AH=01h, 06h, 07h, 08h, 0Ah, в зависимости от того, какой код помещен в регистр AL. Все другие особенности исполнения определяются вызываемой функцией.
При вызове: |
|
AH |
= 0Ch |
AL |
– код вызываемой функции ввода: 01h, 06h, 07h, 08h или 0Ah |
другие регистры – как нужно для вызываемой функции ввода При возврате: то же, что должна возвратить вызванная функция ввода
Примечание 1: нельзя вызывать INT 21\AH=0Ch с указанными выше кодами в AL из командных файлов, которые исполняются с перенаправления: такие вызовы перехватывают из канала STDIN команды, предназначенные интерпретатору.
Примечание 2: если в AL указать не один из перечисленных выше кодов, а какой-нибудь другой, то буфер клавиатуры будет очищен, но управление будет возвращено без попытки считывания данных.
8.02-09 INT 21\AH=0Dh – запись содержимого из буферов на диск
Сброс буферов выполняют каждый раз перед обращением к другому диску. Помимо того, вызовом INT 21\AH=0Dh устанавливается принимаемый по умолчанию адрес области DTA (8.02-16).
При вызове:
AH = 0Dh
При возврате: если флаг CF сброшен, то запись проведена успешно
– 389 –

Глава 8: Вызовы обработчиков прерываний
Примечание 1: вызов INT 21\AH=0Dh не корректирует соответствующим образом записи в каталогах диска. Для этого надо закрывать относящиеся к файлам номерные ссылки посредством INT 21\AH=3Eh (8.02-34).
8.02-10 INT 21\AH=0Eh – назначение "текущего" логического диска
Функция INT 21\AH=0Eh задает тот логический диск, к которому по умолчанию будет отнесено действие дисковых операций, если в их спецификации прямое указание на конкретный логический диск отсутствует.
При вызове: |
|
AH |
= 0Eh |
DL |
– номер назначаемого логического диска (примечание 1) |
При возврате: |
|
AL |
= предельно допустимое число логических дисков, задаваемое |
|
командой LASTDRIVE (4.17, 4.18). |
Примечание 1: в отличие от нумерации дисководов, нумерация логических дисков производится по порядку назначенных им буквенных обозначений: 00h = A:, 01h = B:, 02h = C:, и т.д.
Примечание 2: при вызове INT 21\AH=0Eh из драйверов возвращаемое в AL число может быть неверным, так как оно считывается из "списка списков" (таблица A.01 2, смещение 21h), а заносится туда только после окончания загрузки всех драйверов командами DEVICE (4.06, 4.07).
Примечание 3: номер принимаемого по умолчанию логического диска можно выяснить с помощью INT 21\AH=19h (8.02-15).
8.02-11 INT 21\AH=11h – поиск первого подходящего файла по данным FCB
Обработчик прерывания INT 21\AH=11h использует устаревшую спецификацию FCB (File Control Block), которая непригодна для доступа к файлам на дисках с файловой системой FAT-32, но вполне пригодна для поиска в текущем каталоге, в том числе на дисках с файловой системой FAT-32. Допустимые форматы FCB показаны в таблице A.09-5. Исходные данные в FCB могут содержать знак подстановки "?" (2.01-03). Подготовку исходных данных в формате FCB удобно осуществлять с помощью INT 21\AH=29h (8.02-19).
По окончании поиска некоторые из возвращаемых результатов дополняют данные в FCB, как показано в таблице A.09-5. Но основная часть сведений о найденном файле возвращается в области DTA (Data Transfer Area) размером 128 байт, которая по умолчанию расположена в PSP (A.07-1) начиная со смещения 80h, но может быть перемещена с помощью INT 21\AH=1Ah (8.02-16). Формат возвращаемых данных в DTA зависит от того, какой формат FCB – обычный или
– 390 –

Глава 8: Вызовы обработчиков прерываний
расширенный – был использован при вызове; оба варианта формата возвращаемых данных показаны в таблице A.09-1.
При вызове: |
|
|
|
|
|
|
|
|
|
AH |
= 11h |
|
|
|
|
|
|
|
|
DS:DX – указатель на блок FCB, обычный или расширенный (A.09-5) |
|||||||||
При возврате: |
|
|
|
|
|
|
|
|
|
AL |
– код завершения из таблицы A.06-1. |
|
|
|
|
||||
Область DTA (A.09-1) со сведениями о первом найденном файле. |
|
||||||||
Примечание 1: чтобы |
получить сведения о метке |
диска, нужно |
из |
корневого |
|||||
|
каталога |
вызвать |
INT 21\AH=11h |
с |
использованием |
FCB |
|||
|
расширенного формата и байта атрибутов 08h. |
|
|
|
|||||
Примечание 2: чтобы |
получить сведения о каталоге, нужно из |
вышестоящего |
|||||||
|
каталога |
вызвать |
INT 21\AH=11h |
с |
использованием |
FCB |
|||
|
расширенного формата и байта атрибутов 10h. |
|
|
|
|||||
Примечание 3: если |
предполагается |
продолжить |
поиск |
дальше |
с |
помощью |
|||
|
INT 21\AH=12h (8.02-12), то все данные в FCB и DTA, в том числе |
||||||||
|
возвращенные, должны быть сохранены без изменений. |
|
|
Примечание 4: поиск без обращения к FCB возможен с помощью INT 21\AH=4Eh.
8.02-12 INT 21\AH=12h – поиск следующего файла согласно данным FCB
Обработчик прерывания INT 21\AH=12h следует вызывать для продолжения поиска после успешного завершения миссии INT 21\AH=11h (8.02-11) или после успешного завершения предыдущего вызова INT 21\AH=12h. Данные, оставленные в FCB и DTA предшествовавшей операцией поиска, должны быть сохранены без изменений: они являются исходными для продолжения поиска. Результат поиска возвращается точно так же, как после вызова INT 21\AH=11h (8.02-11).
При вызове: |
|
AH |
= 12h |
DS:DX – указатель на блок FCB, обычный или расширенный (A.09-5). |
|
Данные в области DTA, оставленные предыдущей операцией поиска. |
|
При возврате: |
|
AL |
– код завершения из таблицы A.06-1, причем код FFh означает, |
|
что больше подходящих файлов нет. |
Область DTA (A.09-1) со сведениями об очередном найденном файле.
Примечание 1: все примечания к INT 21\AH=11h (8.02-11) в равной мере относятся также и к INT 21\AH=12h.
– 391 –

Глава 8: Вызовы обработчиков прерываний
8.02-13 INT 21\AH=13h – удаление файлов согласно спецификации FCB
Обработчик прерывания INT 21\AH=13h использует устаревшую спецификацию FCB (File Control Block), которая тем не менее пригодна для удаления одного или нескольких файлов из текущего каталога, в том числе на дисках с файловой системой FAT-32. Допустимые форматы FCB показаны в таблице A.09-5. Для удаления нескольких файлов допускается использование в FCB знака подстановки "?" (2.01-03). Подготовку исходных данных в формате FCB удобно осуществлять с помощью INT 21\AH=29h (8.02-19).
Подлежащие удалению файлы должны быть заранее закрыты (8.02-34), с них должны быть сняты атрибуты HSR (A.09-2), и диск, на котором находятся файлы, не должен быть защищен от записи.
При вызове: |
|
AH |
= 13h |
DS:DX – указатель на блок FCB, обычный или расширенный (A.09-5) |
|
При возврате: |
|
AL |
– код завершения из таблицы A.06-1, причем код FFh означает, |
|
что соответствующие данной спецификации файлы не найдены. |
Примечание 1: благодаря наличию байта атрибутов в расширенном FCB (A.09-5) возможно удаление меток диска и файлов с атрибутом R (только для чтения). Возможно также удаление подкаталогов, но содержащиеся в них файлы не удаляются, а становятся потерянными кластерами.
Примечание 2: удаляемый файл не стирается, просто соответствующая ему запись
в каталоге делается недействительной путем замены первого знака в имени файла кодом E5h.
Примечание 3: удаление с помощью INT 21\AH=13h не затрагивает те записи в каталоге, которые содержат продолжение длинного имени файла.
Примечание 4: удаление файлов без использования спецификации FCB
производится с помощью INT 21\AH=41h (8.02-37).
8.02-14 INT 21\AH=17h – переименование согласно спецификации FCB
При вызове:
AH = 17h
DS:DX – указатель на неоткрытый блок FCB (A.09-5), обычный или расширенный. Прежнее имя записывается на своем обычном месте, новое имя – на 10h байт дальше, то есть точно под первым
вследующей строке дампа. Конкретные значения смещений приведены в таблице A.09-5. Оба имени должны быть записаны
внормализованной форме, например, с помощью
–392 –

Глава 8: Вызовы обработчиков прерываний
INT 21\AH=29h (8.02-19). Требуемая длина буфера – 28 байт для обычного и 35 байт для расширенного FCB.
При возврате:
AL = 00h – успешное переименование, или
= FFh – неудачное завершение: не найдены подходящие файлы, или файл защищен HRS-атрибутами, или файл с заданным новым именем уже существует.
Примечание 1: если используются знаки подстановки "?" (2.01-03), то в обоих именах (или суффиксах) они должны занимать одинаковые места: там будут сохранены знаки из прежнего имени или суффикса.
Примечание 2: в спецификации FCB не предусмотрено указание пути, поэтому переименование производится только в текущем каталоге. Вне
текущего каталога переименование возможно посредством функции
INT 21\AH=56h (8.02-62), не использующей спецификацию FCB.
Примечание 3: при использовании расширенного FCB возможно переименование
подкаталогов из вышестоящего каталога с указанием байта атрибутов 10h, а также меток тома – из корневого каталога с указанием байта атрибутов 08h.
8.02-15 INT 21\AH=19h – выяснение "текущего" логического диска
Функция INT 21\AH=19h возвращает номер того логического диска, который принимается по умолчанию, когда для дисковой операции конкретная спецификация диска не указана.
При вызове: |
|
AH |
= 19h |
При возврате: |
|
AL |
– номер "текущего" логического диска (примечание 1 к 8.02-10). |
Примечание 1: сменить назначение "текущего" логического диска можно с помощью функции INT 21\AH=0Eh (8.02-10).
8.02-16 INT 21\AH=1Ah,2Fh – задание и выяснение адреса области DTA
Область передачи данных DTA (Data Transfer Area) – это буфер длиной 128 байт, используемый обработчиками прерываний INT 21\AH=11h, 12h, 4Eh, 4Fh. По умолчанию область DTA расположена в PSP исполняемой программы начиная со смещения 80h (примечание 6 к A.07-1).
При вызове:
AH = 1Ah – задать новый адрес области DTA
=2Fh – выяснить действующий адрес области DTA
–393 –

Глава 8: Вызовы обработчиков прерываний
DS:DX – новый адрес области DTA (только при вызове с AH = 1Ah) При возврате:
ES:BX – действующий адрес DTA (только после вызова с AH = 2Fh)
Примечание 1: форматы данных в области DTA показаны в таблице A.09-1. Примечание 2: принимаемый по умолчанию адрес области DTA (PSP:0080h)
восстанавливается при каждом вызове INT 21\AH=0Dh (8.02-09).
8.02-17 |
INT 21\AH=1Ch – получение сведений о диске |
|
При вызове: |
|
|
|
AH |
= 1Ch |
|
DL |
– номер диска (примечание 1) |
При возврате: |
|
|
|
AH |
– байт-идентификатор носителя записи: |
|
|
= F8h – жесткий магнитный диск, |
|
|
= F9h – дискета емкостью 1.2 Мбайт или 720 кбайт, |
|
|
= FAh – виртуальный RAM-диск, |
|
|
= FDh – дискета емкостью 360 кбайт, |
|
|
= F0h – все другие, включая дискеты емкостью 1.44 Мбайт. |
|
CX |
– длина сектора в байтах; |
|
DS:BX – указатель на байт-идентификатор, записанный в память; |
|
|
|
данные в DX и AL не сохраняются. |
Примечание 1: здесь используется смещенная нумерация логических дисков, при которой 00h – это "текущий" (принимаемый по умолчанию) диск, а
потом следуют 01h = A:, 02h = B:, 03h = C:, и т.д.
Примечание 2: при запросе данных недействующего или несуществующего диска INT 21\AH=1Ch не объявляет об ошибке, а просто не изменяет значения в AH, BX и DS. Но данные в DX и в AL утрачиваются.
Примечание 3: аналогичным образом вызов INT 21\AH=1Bh сообщает сведения о текущем диске, игнорируя номер в регистре DL. И INT 21\AH=1Ch, и INT 21\AH=1Bh, – устаревшие функции, не поддерживающие большинство современных типов носителей.
8.02-18 |
INT 21\AH=25h – записать новый указатель в таблицу прерываний |
|
При вызове: |
|
|
|
AH |
= 25h |
|
AL |
– номер прерывания |
DS:DX – указатель, который надлежит записать
Примечание 1: при записи нового указателя прежний указатель утрачивается. Если его надо сохранить, то побеспокоиться об этом надо заранее.
– 394 –

Глава 8: Вызовы обработчиков прерываний
Примечание 2: обработчик прерывания INT 21\AH=25h, поставляемый MS-DOS7,
можно использовать при работе в реальном режиме и в режиме V86, но при работе в защищенном режиме его использовать нельзя.
8.02-19 INT 21\AX=2901h – разбор имени для записи в FCB
Обработчик прерывания INT 21\AX=2901h преобразует имя файла в нормализованный вид и формирует неоткрытый блок FCB (File Control Block) обыкновенного типа (A.09-5). Имя и суффикс записываются отдельно в свои поля блока FCB, причем буквы переводятся в заглавные, знаки подстановки "звездочка" (2.01-03) заменяются должным числом знаков "?". Если длина имени меньше 8 знаков, а длина суффикса меньше 3 знаков, то оставшиеся знакоместа заполняются кодами пробела (20h). Разбор заканчивается на первом встреченном знаке пробела, косой черты, или на байте 0Dh (завершение на байте 00h не допускается).
Перед именем нельзя указывать путь, но допускается указание буквы диска (например, A:Config.sys). Буква диска переводится в номер и записывается перед именем в поле номера диска. Если второй знак в представленной строке не является двоеточием, то считается, что диск не указан, и тогда в поле номера диска в FCB записывается код 00h, что означает "текущий" диск.
При вызове: |
|
AH |
= 2901h |
DS:SI – указатель на подлежащую разбору строку |
|
ES:DI – указатель на место для размещения FCB длиной 21 байт |
|
При возврате: |
|
AL |
= 00h – успешное завершение, знаки подстановки не встречены |
=01h – успешное завершение со знаками подстановки
=FFh – неудачное завершение, неверная спецификация DS:SI – указатель на первый "неразобранный" знак
ES:DI – указатель на сформированный блок FCB
Примечание 1: если в дальнейшем формируемый блок FCB будет использован для доступа к файлу, то длина буфера должна быть 36 байт.
Примечание 2: INT 21\AX=2903h делает то же самое, но только не перезаписывает прежнее содержание поля номера диска в блоке FCB.
8.02-20 INT 21\AH=2Ah – определение системной даты
При вызове: |
|
AH |
= 2Ah |
При возврате: |
|
AL |
– день недели (00h = воскресенье) |
– 395 –

Глава 8: Вызовы обработчиков прерываний
CX |
– год (в пределах 1980 – 2099) |
DH |
– месяц |
DL |
– день |
Примечание 1: все значения – в упакованном десятичном формате, по две
|
|
десятичные цифры на байт. |
Примечание 2: для задания новой даты нужно подготовить данные в AL, CX, DH и |
||
|
|
DL так же, как показано выше, и затем вызвать INT 21\AH=2Bh. |
|
|
При неудачном завершении дата не будет изменена, а в AL будет |
|
|
возвращено значение FFh. |
8.02-21 |
INT 21\AH=2Ch – определение системного времени |
|
При вызове: |
|
|
|
AH |
= 2Ch |
При возврате: |
|
|
|
CH |
– часы |
|
CL |
– минуты |
|
DH |
– секунды |
|
DL |
– сотые доли секунды |
Примечание 1: все значения – в упакованном десятичном формате, по две десятичные цифры на байт.
Примечание 2: некоторые компьютеры считают значение в DL шагами по 0.05 секунды; встречаются и такие, которые всегда возвращают DL=00h.
Примечание 3: чтобы задать время, нужно подготовить данные в CH, CL, DH и DL так же, как показано выше, и затем вызвать INT 21\AH=2Dh. При неудачном завершении время не будет изменено, а в AL будет возвращено значение FFh.
8.02-22 INT 21\AH=30h – определение версии DOS
При вызове:
AX = 3000h – возвратить в BH идентификатор разработчика DOS. = 3001h – возвратить в BH флаг версии DOS.
При возврате:
AL.AH – номер версии
BH – идентификатор разработчика или флаг версии DOS.
Примечание 1: идентификаторы разработчиков: 00h – IBM, 66h – ФизТехСофт, EEh – DR-DOS, EFh – Novell, FDh – FreeDOS, FFh – Microsoft.
Примечание 2: если в флаге версии установлен бит 3, то это специальная версия для поставки DOS в микросхемах постоянной памяти.
– 396 –

Глава 8: Вызовы обработчиков прерываний
Примечание 3: возвращаемый номер версии считывается из слова со смещением 40h в PSP (A.07-1) вызывающей программы. Если установлен драйвер SETVER.EXE (5.01-02), и имя вызывающей программы внесено в таблицу этого драйвера, то в момент запуска программы в ее PSP вместо действительного номера версии DOS будет записан "подставной" номер из этой таблицы.
Примечание 4: чтобы получить заведомо не подмененный номер DOS, нужно вызывать INT 21\AX=3306h (8.02-27).
8.02-23 |
INT 21\AH=31h – завершение исполнения с оставлением TSR-модуля |
|
При вызове: |
|
|
|
AH |
= 31h |
|
AL |
– оставляемое значение кода ошибки (примечание 3 к 8.02-55) |
|
DX |
– размер резидентного модуля в 16-байтовых параграфах, не |
|
|
менее 6 параграфов, отсчитывается от начала PSP. |
Примечание 1: вызов INT 21\AH=31h высвобождает занятую программой память, за исключением резидентного модуля, восстанавливает указатели в таблице прерываний по данным из PSP, восстанавливает состояния сегментных регистров и стека, а затем передает управление по адресу, определяемому указателем INT 22 (8.02-82). Но функция INT 21\AH=31h не закрывает открытые файлы, не высвобождает область окружения и ту память, которая предоставлена программе посредством прерывания INT 21\AH=48h (8.02-50). При
необходимости эти операции должна заранее выполнить сама завершаемая программа.
Примечание 2: устаревшее прерывание INT 27 делает то же самое, но не позволяет оставить ненулевые значения кода ошибки (errorlevel) и ограничивает размер резидентного модуля величиной 64 кбайт.
8.02-24 |
INT 21\AH=32h – адрес блока параметров диска (DPB) |
|
При вызове: |
|
|
|
AH |
= 32h |
|
DL |
– номер диска (примечание 1 к 8.02-17) |
При возврате: |
|
|
|
AL |
= FFh, – запрошен сетевой или недействительный диск; |
|
|
= 00h, – запрос выполнен успешно, и тогда |
|
DS:BX – указатель на блок параметров диска (DPB, A.03-1) |
Примечание 1: INT 21\AH=1Fh тоже возвращает в DS:BX указатель на блок DPB, но только для "текущего" диска; значение в DL игнорируется.
– 397 –

Глава 8: Вызовы обработчиков прерываний
Примечание 2: и INT 21\AH=32h, и INT 21\AH=1Fh стараются обновить блок параметров посредством считывания данных с диска. При неудаче считывания следует вызов INT 24 с его вопросом "Abort, Retry, Fail?". Если такой исход в данный момент нежелателен, то указатель на блок DPB следует искать через "список списков" (примечание 1 к A.01-2).
Примечание 3: и INT 21\AH=32h, и INT 21\AH=1Fh нельзя применять по отношению к дискам с файловой системой FAT-32; вместо них следует вызывать INT 21\AX=7302 (8.02-79).
8.02-25 |
INT 21\AX=3300h – определение состояния флага BREAK |
||
При вызове: |
|
|
|
|
AX |
= 3300h |
|
При возврате: |
|
|
|
|
DL |
= 00h |
– флаг BREAK сброшен (OFF), |
|
|
= 01h |
– флаг BREAK установлен (ON). |
Примечание 1: флаг BREAK находится в области текущих данных DOS (A.01-3, смещение 17h).
Примечание 2: функция INT 21\AX=3301 позволяет изменить состояние флага BREAK и принимает его из регистра DL в тех же обозначениях.
8.02-26 INT 21\AX=3305h – выяснение загрузочного диска
При вызове: |
|
AX |
= 3305h |
При возврате: |
|
DL |
– номер загрузочного диска (примечание 1 к 8.02-17) |
Примечание 1: номер логического диска, с которого компьютер был загружен, считывается из "списка списков" (A.01-2, смещение 43h).
8.02-27 |
INT 21\AX=3306h – истинная версия DOS |
|
При вызове: |
|
|
|
AX |
= 3306h |
При возврате: |
|
|
|
AL |
= FFh, если версия DOS меньше 5.00 |
|
BL.BH – версия DOS |
|
|
DH |
– флаги: |
|
|
бит 3 – DOS в микросхемах постоянной памяти |
|
|
бит 4 – DOS загружена в область HMA |
|
DL |
– номер ревизии версии DOS. |
|
|
– 398 – |