Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
86
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 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 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]