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

Dos7book

.pdf
Скачиваний:
97
Добавлен:
09.02.2015
Размер:
5 Мб
Скачать
☆

Глава 8: Вызовы обработчиков прерываний

8.02-45

INT 21\AX=440Ah – проверка сетевого доступа по номерной ссылке

При вызове:

 

 

AX

= 440Ah

 

BX

– номерная ссылка (8.02-33)

При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, то DX >= 8000h означает доступ по ссылке через сеть.

8.02-46 INT 21\AX=440Dh – родовой вызов дисковых подфункций

INT 21\AX=440Dh фактически представляет собой шаблон для вызова множества подфункций. Тип подфункции определяется кодом в регистре CL. Регистр CH при вызове содержит код категории: CH=08h соответствует дисковым подфункциям, которые унаследованы от предыдущих версий DOS и применимы к дискам с файловыми системами FAT-12 и FAT-16. Код категории CH=48h соответствует дисковым подфункциям, которые впервые введены в MS-DOS7 и позволяют обращаться к дискам с файловой системой FAT-32.

Здесь представлены только подфункции категории CH=48h, причем только те из них, которые одинаково применимы к дискам с файловыми системами FAT-12, FAT-16, FAT-32 и не требуют поддержки расширенного набора функций прерывания INT 13 (8.01-55) со стороны системы BIOS компьютера. Посредством вызова INT 21\AX=4411h (8.02-47) можно проверить, поддерживается ли конкретная подфункция Вашим компьютером.

Общая форма представления данных для всех подфункций – это блок данных, указатель на который помещается в регистры DS:DX. Распределение данных в этом блоке показано в приложении A.04 для ряда подфункций отдельно. Особые условия для некоторых подфункций оговорены ниже в примечаниях.

При вызове:

 

AX

= 440Dh

BL

– номер диска (примечание 1 к 8.02-17)

CX

– подфункция:

= 4840h – задать параметры диска из таблицы (A.04-3) = 4841h – записать дорожку логического диска (A.04-4)

= 4842h – форматировать и сверить дорожку диска (A.04-5) = 4846h – задать серийный номер тома (A.04-1)

= 4847h – установить флаг доступа (примечание 1)

= 4848h – установить состояние блокировки (примечание 2) = 4849h – вытолкнуть диск из дисковода (без блока данных) = 4860h – считать таблицу параметров диска (A.04-3)

= 4861h – считать дорожку логического диска (A.04-4) = 4862h – сверить дорожку логического диска (A.04-5)

– 409 –

Глава 8: Вызовы обработчиков прерываний

=4866h – считать метку тома и тип FAT (A.04-1)

=4867h – считать флаг доступа (примечание 1)

=4868h – определить тип дискеты (примечание 3) DS:DX – указатель на блок исходных данных, если он требуется

При неудачном завершении флаг CF установлен, в AX – код завершения (A.06-1). Если флаг CF сброшен, и если подфункция должна возвращать данные, то

DS:DX – указатель на блок возвращаемых данных.

Примечание 1: подфункция CX=4847h принимает, а подфункция 4867h возвращает в блоке данных DS:DX только один байт доступа (смещение 01h). Любое ненулевое значение означает, что доступ разрешен.

Примечание 2: в блоке данных в байте со смещением 00h подфункция CL=48h принимает код операции: 00h – заблокировать диск, 01h – разблокировать, 02h – доложить статус блокировки (так же, как INT 13\AH=45h, 8.01-58). Статус выражает уровень вложенности блокирования и возвращается в байте 01h блока данных.

Примечание 3: в блоке данных в байте со смещением 00h подфункция CL=4868h возвращает 01h, если дискета соответствует типу дисковода, или 00h при всех других типах носителей, а в байте со смещением 01h возвращает код типа дискеты: 02h – дискета 720 кбайт, 07h – дискета 1.44 Мбайт, 09h – дискета 2.88 Мбайт.

8.02-47 INT 21\AX=4411h – поддержка функций родового вызова

Обработчик прерывания INT 21\AX=4411h сообщает, поддерживается ли указанная подфункция родового вызова системой BIOS, аппаратными средствами и загруженными драйверами в конкретном компьютере.

При вызове:

 

AX

= 4411h

BL

– номер диска (примечание 1 к 8.02-17)

CX

– код подфункции, как для INT 21\AX=440Dh (8.02-46).

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, и AX=0000h, то функция поддерживается

Примечание 1: поддержку самой проверки посредством INT 21\AX=4411h, как и других функций управления вводом-выводом, можно определить по слову признаков (A.05-2) соответствующего драйвера.

8.02-48 INT 21\AH=45h\46h – выдача дубликата номерной ссылки

Обработчик прерывания INT 21\AH=45h копирует указатель из одной ячейки таблицы JFT (примечание 3 к таблице A.07-1) в ближайшую свободную ячейку той

– 410 –

При вызове: AH
BX
CX

Глава 8: Вызовы обработчиков прерываний

же таблицы JFT. Номера обеих этих ячеек становятся ссылками на один и тот же объект. Ссылку-дубликат создают для перераспределения указателей, для сохранения указателя, а иногда только для того, чтобы ее аннулировать, вызывая тем самым запись файла из памяти на диск без закрытия файла.

Вызов INT 21\AH=46h тоже выполняет копирование указателя, но помещает копию в заданную программистом ячейку таблицы JFT, замещая там прежний указатель. Например, если номерную ссылку 0001h, относящуюся к каналу STDOUT, сделать дубликатом номерной ссылки на файл, то вместо вывода данных на экран дисплея будет происходить запись данных в этот файл. Именно так DOS осуществляет перенаправление каналов ввода и вывода (2.04-02 – 2.04-05).

= 45h – дублирование без замещения имеющихся ссылок = 46h – дублирование с замещением заданного указателя

– действующая номерная ссылка, которую надо продублировать

– номерная ссылка, которая должна стать дубликатом другой ссылки на тот же объект (только для вызова с AH=46h)

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то миссия выполнена успешно, и тогда

AX – автоматически назначенный дубликат номерной ссылки (только после вызова с AH=45h).

Примечание 1: если при вызове INT 21\AH=46h в регистре CX указана действующая ссылка на другой открытый файл, то он автоматически будет закрыт.

Примечание 2: смещение места доступа по одной номерной ссылке влечет такое же смещение по дублирующей ссылке, потому что соответствующие им ячейки таблицы JFT содержат указатели на один и тот же блок

 

 

описания в таблице SFT (A.01-4).

8.02-49

INT 21\AH=47h – определение текущего каталога

При вызове:

 

 

AH

= 47h

 

DL

– номер диска (примечание 1 к 8.02-17)

DS:SI – адрес 64-байтового буфера для пути и имени каталога

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, содержимое AX утрачено, буфер DS:SI

заполнен; конец записи в буфере отмечен байтом 00h.

Примечание 1: возвращаемый в буфере путь не содержит имени диска и начальной обратной косой черты.

– 411 –

Глава 8: Вызовы обработчиков прерываний

Примечание 2: изменить текущий каталог можно посредством INT 21\AH=3Bh

 

 

(8.02-32).

8.02-50

INT 21\AH=48h – выделение блока памяти для программы

При вызове:

 

 

AH

= 48h

 

BX

– размер запрашиваемого блока в 16-байтовых параграфах

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1).

Если флаг CF сброшен, то

 

AX

– сегментный адрес выделенного блока

 

BX

– размер наибольшего свободного блока в памяти.

Примечание 1: запрос блока размером BX=FFFFh обречен на неудачу, но при этом обработчик прерывания INT 21\AH=48h возвратит в регистре BX размер всего свободного пространства обыкновенной памяти.

Примечание 2: DOS может отвечать отказом с кодом завершения 08h ("имеющейся памяти недостаточно") на любой запрос о выделении памяти во время исполнения программ с суффиксом *.COM, потому что по

умолчанию таким программам предоставляется все имеющееся пространство памяти (подробнее – в примечании 5 к A.12-7). Программы с суффиксом *.COM должны декларировать размер используемой ими памяти посредством INT 21\AH=4Ah, иначе все остальное пространство памяти DOS не будет считать свободным.

8.02-51

INT 21\AH=49h – высвобождение блока памяти

При вызове:

 

 

AH

= 49h

 

ES

– сегментный адрес высвобождаемого блока

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1).

Если флаг CF сброшен, то миссия завершена успешно.

8.02-52

INT 21\AH=4Ah – изменение размера выделенного блока памяти

При вызове:

 

 

AH

= 4Ah

 

BX

– новый размер блока в 16-байтовых параграфах

 

ES

– сегментный адрес блока, размер которого надо изменить

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1).

Если флаг CF сброшен, то миссия завершена успешно, и тогда

 

BX

– максимальное число параграфов, которое можно предоставить

– 412 –

Глава 8: Вызовы обработчиков прерываний

Примечание 1: если памяти недостаточно, и запрошенное число параграфов предоставить нельзя, то блок будет увеличен настолько, насколько это возможно.

8.02-53

INT 21\AH=4Bh – загрузка программы для исполнения

При вызове:

 

 

 

AH

= 4Bh

 

AL

= 00h

– загрузка и запуск программы на исполнение

 

 

= 01h

– загрузка без инициализации исполнения

 

 

= 03h

– загрузка оверлея (заменяемого фрагмента кода)

 

DS:DX – указатель на строку с полной спецификацией вызова

программы. Имя программы должно быть приведено с суффиксом. Строка должна кончаться байтом 00h.

ES:BX – указатель на блок параметров из таблицы A.07-2.

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). При успешном завершении флаг CF сброшен; данные в BX и DX утрачены.

Примечание 1: подфункция AL=00h копирует окружение вызывающей программы

в сегмент окружения загружаемой программы и создает для нее новый PSP (A.07-1), причем в нем строка вызова заканчивается байтом 00h (а не байтом 0Dh, как обычно).

Примечание 2: миссия проверки наличия достаточной свободной памяти для загружаемой программы возложена на вызывающий процесс.

Примечание 3: подфункция AL=01h обслуживает загрузку программы точно так же, но не инициирует ее исполнение. Чтобы позже это смогла сделать вызывающая программа, ей в составе того же исходного блока данных (A.07-2) подфункция AL=01h возвращает адрес вызова загруженной программы и указатель на вершину ее стека.

Примечание 4: если программа начинается с байтов MZ или ZM, то она ставится на исполнение как файл формата *.EXE. Чтобы программа была поставлена на исполнение как файл *.COM, ее первыми байтами не должны быть MZ, NE, LE, LX, W3, W4, PE, PL, MP, P2, P3, ZM.

Примечание 5: чтобы посредством INT 21\AH=4Bh исполнить batch-файл, нужно загрузить интерпретатор COMMAND.COM (6.04) с параметром /C, указав после него имя подлежащего исполнению batch-файла.

Примечание 6: подфункция AL=03h загружает в память оверлей, не проверяя принадлежность выделенной памяти вызывающей программе. При этом окружение и префикс сегмента программы не создаются, исполнение загруженного оверлея не начинается, и состав параметров в блоке, на который указывают регистры ES:BX, должен быть другим: первое слово – сегментный адрес загрузки оверлея, слово со смещением 02h – смещение оверлея в сегменте.

– 413 –

Глава 8: Вызовы обработчиков прерываний

8.02-54 INT 21\AX=4B05h – задание условий исполнения

Функция INT 21\AX=4B05h используется обработчиками, которые перехватывают вызовы INT 21\AX=4B00h чтобы подготовить загруженную программу к исполнению, включая указание требуемого номера версии DOS.

При вызове:

 

 

 

AX

= 4B05h

 

 

DS:DX – указатель на дескриптор условий исполнения A.07-3

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1).

При удачном завершении флаг CF сброшен, в AX записано число 0000h

Примечание 1: между вызовом INT 21\AX=4B05h и

моментом передачи

 

 

управления загруженной программе не допускаются вызовы

 

 

никаких прерываний.

 

Примечание 2: если DOS загружена в область верхней

памяти (HMA), то при

 

 

возврате из INT 21\AX=4B05h линия A20 отключается.

8.02-55

INT 21\AH=4Ch – завершение исполнения с указанием уровня ошибки

При вызове:

 

 

 

AH

= 4Ch

 

 

AL

– шестнадцатеричный код уровня ошибки (примечание 3)

При возврате:

 

 

возврата не будет

Примечание 1: перед вызовом INT 21\AH=4Ch все установленные программой сетевые блокировки должны быть сняты.

Примечание 2: вызов INT 21\AH=4Ch закрывает все открытые процессом файлы и высвобождает всю используемую процессом память, но при условии, что указатель на родительский процесс в PSP (смещение 16h в таблице A.07-1) не указывает на сегмент того же PSP. Последнее есть признак невыгружаемой резидентной программы; ею может быть, например, командный интерпретатор

COMMAND.COM.

Примечание 3: код уровня ошибки (errorlevel) записывается в слово со смещением 14h в области текущих данных DOS, показанной в таблице A.01-3. Он может быть считан функцией INT 21\AH=4Dh (8.02-56) или проверен операцией "if errorlevel..." (3.15-03).

Примечание 4: в среде отладчика Debug.exe INT 21\AH=4Ch закрывает сеанс работы с отладчиком и передает управление DOS. Если сеанс должен быть продолжен, то завершать исполнение отлаживаемой программы надо иначе, например, посредством точек останова или вызовом INT 20 (8.02-01).

– 414 –

Глава 8: Вызовы обработчиков прерываний

8.02-56

INT 21\AH=4Dh – считывание кода уровня ошибки

При вызове:

 

 

 

AH

= 4Dh

 

При возврате:

 

 

 

AH

– тип завершения:

 

 

= 00h – нормальный (8.02-01, 8.02-55)

 

 

= 01h

– по нажатию Ctrl-C, Ctrl-Break (8.01-95, 8.02-83)

 

 

= 02h

– по возникновению критической ошибки (8.02-84)

 

 

= 03h

– с оставлением TSR-модуля (8.02-23, 8.02-86).

 

AL

– шестнадцатеричное значение кода уровня ошибки (errorlevel).

Примечание 1: код уровня ошибки характеризует завершение предыдущей программы, за исключением резидентных программ и программ, исполняемых в фоновом режиме.

Примечание 2: код уровня ошибки находится в слове со смещением 14h в области текущих данных DOS (A.01-3), причем после вызова INT 21\AH=4Dh он автоматически обнуляется, так что считать его дважды нельзя. Многократное считывание кода уровня ошибки возможно из batch-файлов (3.15-03).

Примечание 3: встроенные команды интерпретатора COMMAND.COM не оставляют кода уровня ошибки и не изменяют значение, оставленное после исполнения предшествовавшей программы.

8.02-57 INT 21\AH=4Eh – поиск первого подходящего файла

Обработчик прерывания INT 21\AH=4Eh оставляет найденные сведения в области DTA, которая по умолчанию находится в префиксе сегмента программы (PSP, A.07-1) начиная со смещения 0080h. Расположение области DTA можно изменять и определять посредством INT 21\AH=1Ah,2Fh (8.02-16). Формат возвращаемых в DTA данных показан в таблице A.09-1 (колонка F4E).

При вызове:

 

AX

= 4E00h

CH

= 00h

CL

– маска атрибутов файла, показанная в таблице A.09-2.

DS:DX – указатель на строку с именем искомого файла. Имени может предшествовать путь. В имени допускается наличие знаков подстановки. Строка должна кончаться байтом 00h.

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то в DTA записан блок данных (A.09-1).

Примечание 1: биты 0 и 5 в маске атрибутов файла (A.09-2) игнорируются. Установление битов 1, 2 и 4 в маске атрибутов файла не исключает

– 415 –

Глава 8: Вызовы обработчиков прерываний

поиска файлов, не имеющих соответствующих атрибутов. Установление бита 3 (метка тома) исключает поиск файлов.

Примечание 2: поиск в текущем каталоге возможен также с помощью

INT 21\AH=11h.

8.02-58 INT 21\AH=4Fh – поиск следующего подходящего файла

При вызове:

AH = 4Fh

В области DTA – сохраненные результаты предыдущего поиска

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то в DTA обновлен блок данных (A.09-1).

Примечание 1: для продолжения поиска обработчик прерывания INT 21\AH=4Fh использует данные, полученные в результате предшествующего вызова INT 21\AH=4Eh или INT 21\AH=4Fh, и сохраняемые с того момента без изменений в области DTA (8.02-16). Во избежание

возникновения различий между этими данными и реальным расположением файлов нельзя выполнять операции переименования, перемещения или удаления файлов, пока попытки продолжения поиска не прекращены.

8.02-59 INT 21\AH=52h – адрес "списка списков"

При вызове:

AH = 52h

При возврате:

ES:BX – указатель на "список списков" (A.01-2)

Примечание 1: возвращаемый сегментный адрес в ES указывает на блок данных DOS, создаваемый загрузчиком IO.SYS.

Примечание 2: если прикладная программа исполняется не в реальной, а в эмулируемой среде DOS, то надо быть готовым к тому, чтобы

получить и отвергнуть заведомо недействительные значения в

 

 

ES:BX, например, 0000:0000h или FFFF:FFFFh.

8.02-60

INT 21\AH=54h – считывание состояния флага сверки

При вызове:

 

 

 

AH

= 54h

 

При возврате:

 

 

 

AL

= 00h

– флаг сверки сброшен (OFF),

 

 

= 01h

– флаг сверки установлен (ON)

– 416 –

Глава 8: Вызовы обработчиков прерываний

Примечание 1: при установленном флаге сверки после каждой операции записи на диск выполняется сверка сигналограммы (подробнее – в разделе 3.33). По умолчанию флаг сверки сброшен.

Примечание 2: задать новое состояние флага сверки можно посредством вызова INT 21\AH=2Eh, причем перед вызовом новое состояние должно быть указано в AL так же, как его возвращает INT 21\AH=54h.

8.02-61 INT 21\AH=55h – создание производного PSP

Обработчик прерывания INT 21\AH=55h создает производный (дочерний) префикс сегмента программы (PSP, A.07-1), в котором в поле адреса родительского PSP указан адрес PSP вызывающей программы. Помимо того, в новом PSP заполняются поля адресов обработчиков прерываний (INT 22, 23, 24), в поля таблицы JFT, соответствующие наследуемым номерным ссылкам, вносятся номера блоков описания таблицы SFT (A.01-4), а в самих этих блоках описания счетчики ссылок получают приращение на единицу. Созданный PSP готов к тому, чтобы обслужить исполнение COM-файла.

При вызове:

 

AH

= 55h

DX

– сегментный адрес, начиная с которого надо разместить PSP

SI

– объем памяти для записи в поле со смещением 02h в PSP

При возврате содержимое AL не сохраняется.

Примечание 1: до обращения к INT 21\AH=55h необходимо побеспокоиться о том, чтобы сегмент, где будет размещен новый PSP, был бы выделен операционной системой посредством INT 21\AH=48h (8.02-50). Подлежащий исполнению COM-файл надо будет скопировать в этот сегмент начиная со смещения 100h. После этого процедура

передачи управления включает переопределение идентификатора текущего процесса с помощью INT 21\AH=50h (примечание к 8.02-73) и дальний переход на адрес 100h относительно начала созданного PSP.

8.02-62 INT 21\AH=56h – корректировка записей в каталогах

Посредством корректировки записей в каталогах можно выполнять переименование файлов и каталогов, а также перемещение файлов из одного каталога в другой на том же диске. Перемещение записей о файлах из одного каталога в другой выполняется гораздо быстрее, чем копирование файлов.

При вызове:

AH = 56h

– 417 –

Глава 8: Вызовы обработчиков прерываний

DS:DX – указатель на строку с именем существующего объекта, файла или каталога (примечание 4). Имени может предшествовать путь. Строка должна кончаться байтом 00h.

ES:DI – указатель на строку с новым именем (примечание 4) или с другим путем. Строка должна кончаться байтом 00h.

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1). Если флаг CF сброшен, то миссия завершена успешно.

Примечание 1: если DS:DX указывает на файл, а ES:DI – на существующий каталог того же диска, то соответствующая файлу запись будет перемещена в этот каталог без копирования файла.

Примечание 2: если ES:DI указывает на новое имя, а DS:DX – на существующий объект – закрытый файл или каталог, то этот объект будет переименован. Но переименование открытых файлов не допускается.

Примечание 3: обработчик прерывания INT 21\AH=56h не присваивает перемещенным и переименованным файлам атрибут "A" (подлежит архивированию).

Примечание 4: чтобы переименовать группу файлов, используя в именах знаки подстановки (2.01-03), необходимо вызывать INT 21\AH=56h через серверную функцию INT 21\A=5D00h (8.02-68). Помимо знаков подстановки, серверная функция принимает в регистре CL маску атрибутов (A.09-2), и в случае успешного завершения возвращает AL=12h (= подходящих файлов больше нет).

8.02-63

INT 21\AX=5700h – время и дата последнего изменения файла

При вызове:

 

 

AX

= 5700h

 

BX

– номерная ссылка на файл (8.02-33)

При неудачном завершении флаг CF установлен, в AL – код завершения (A.06-1).

Если флаг CF сброшен, то:

 

CX

– время последнего изменения файла, причем

 

 

биты 15-11 – часы от 00 до 23;

 

 

биты 10-5 – минуты;

 

 

биты 4-0 – секунды.

 

DX

– дата последнего изменения файла, причем

 

 

биты 15-9 – год, отсчитываемый от 1980-го;

 

 

биты 8-5 – месяц;

 

 

биты 4-0 – день.

– 418 –

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