|
КАК ПОЛУЧИТЬ АДРЕС БУФЕРА ДИСКА ( ФУНКЦИЯ 2FH
)
Вызов: АН = 2FH
Возвращает: ES:BX - указатель на Буфер обмена
с диском
Комментарий:
Функция возвращает сегментный адрес DTA в ES, а смещение
в BX.
Макроопределение:
get-dta macro
mov ah,2FH
int 21H
endm
Пример:
Следующая программа выводит на экран адрес текущего
Буфера обмена с диском , по форме - сегмент:смещение.
message db "DTA - ",0DH,0AH,"$"
sixteen db 10H
temp db 2 dup (?)
;
begin: get-dta ; Наша функция
mov word ptr temp,es ; Для доступа к каждому
; байту
; Описание CONVERT
; дается в конце главы
convert temp[1],sixteen,message[07H]
convert temp,sixteen,message[09H]
convert bh,sixteen,message[0CH]
convert bl,sixteen,message[0EH]
display message ; См. функцию 09Н
ПОЛУЧИТЬ НОМЕР ВЕРСИИ MS-DOS ( ФУНКЦИЯ 30Н )
Вызов: АН = 30Н
Возвращает: AL - номер основной версии
АН - номер модификации
ВН - серийный номер OEM
BL:CX - 24-битовый (серийный)
номер пользователя
Комментарий:
Функция 30Н возвращает номер версии MS-DOS. Например,
MS-DOS 3.0 при вызове этой функции возвращает 3 в AL, и 0 в АН.
Если AL возвращает ноль, то номер версии MS-DOS меньше 2.0.
- 78 -
Макроопределение:
get-version macro
mov ah,30H
int 21H
endm
Пример:
Следующая программа выводит на экран номер версии MS-DOS,
если он равен или выше 1.28.
message db "MS-DOS Версия . ",0DH,0AH,"$"
ten db 0AH ; Для CONVERT
;
begin: get-version ; Наша функция
cmp al,0 ; 1.28 или выше?
jng return ; Нет, возврат
convert al,ten,message[0FH] ; Описание CONVERT
convert ah,ten,message[12H] ; дано в конце главы
display message ; См. функцию 09Н
СОХРАНИТЬ ПРОГРАММУ ( ФУНКЦИЯ 31Н )
Вызов: АН = 31Н
AL - код выхода
DX - размер памяти в параграфах
Возвращает: --
Комментарий:
Функция 31Н сохраняет программу в памяти после ее
окончания. Вы можете использовать эту функцию для внедрения в
систему своих программ обработки прерываний. В отличие от
Прерывания 27Н ( Закончить, но оставить в памяти), эта функция
позволяет сохранять программы, размеры которых превышают 64К,
и не требует загрузки в CS сегментного адреса PSP. Пользуйтесь
функцией 31Н, если ваша программа не требует совместимости с
версиями системы до 2.0.
DX должен содержать количество параграфов памяти,
требуемое программой ( один параграф = 16 байт). AL содержит
код выхода.
Будте осторожны при пользовании этой функцией с .exe
программами. DX должен содержать весь об'ем памяти программы,
а не только кодового сегмента. Типичная ошибка состоит в том,
что обычно забывают о 100Н-байтовом префиксе программы и
загружают в DL значение, не учитывающее этот префикс.
Используя функцию 4DH (Получить код возврата дочерней
программы), вызвавшая программа может получить код выхода из
AL. ( Вы можете протестировать этот код пользуясь командой IF
с ERRORLEVEL.)
Макроопределение:
keep-process macro return-code,last-byte
mov al,return-code
mov dx,offset last-byte
mov cl,4
- 79 -
shr dx,cl
inc dx
mov ah,31H
int 21H
endm
Пример:
Так как большинство применений этой функции связано с
введением в систему специфичных для каждой машины процедур,
пример не приводится.
ПРОВЕРКА ПО CONTROL+C ( ФУНКЦИЯ 33Н )
Вызов: АН = 33Н
AL - 0 = получить состояние флага
проверки на CONTROL+C
1 = изменить этот флаг
5 = получить дисковод, используемый
для загрузки DOS
DL (если AL = 1) - 0 = сбросить
1 = установить
Возвращает: DL (если AL = 0) - 0 = сброшен
1 = установлен
DL (если AL = 5) - номер дисковода
( 1=А, 2=В и т.д.)
AL - FFH = ошибка (AL не 0, не 1 и не 5)
Комментарий:
Функция 33Н получает состояние флага
включения/выключения проверки на CONTROL+C (или
CONTROL+BREAK) или устанавливает его. Кроме того, она
устанавливает, какой дисковод используется для загрузки
операционной системы. AL содержит код выполняемой операции:
Код Значение
__________________________________________________________
0 Текущее состояние флага в DL
1 Изменить состояние флага, как указано в DL
5 Дисковод, используемый для загрузки системы - в DL
__________________________________________________________
Обычно MS-DOS проверяет на ввод CONTROL+C только при
выполнении определенных функций (01Н - 0СН). Если же флаг
установлен, то проверка осуществляется при выполнении любых
функций.
__________________________________________________________
Примечание
Программы, использующие функции 06Н (Прямой
ввод/вывод с/на консоли) и 07Н (Прямой ввод с
консоли ) для чтения CONTROL+C в качестве
данных, должны убедится, что флаг сброшен.
__________________________________________________________
- 80 -
Макроопределение:
ctrl-c-ck macro action,state
mov al,action
mov dl,state
mov ah,33H
int 21h
endm
Пример:
Следующая программа сообщает, включена ли проверка на
CONTROL+C или нет.
message db "Проверка на CONTROL+C ","$"
on db "включена","$",0DH,0AH,"$"
off db "выключена","$",0DH,0AH,"$"
;
begin: display message ; См. функцию 09Н
ctrl-c-ck 0 ; Наша функция
cmp dl,0 ; Выключена?
jg ck-on ; Нет
display off ; См. функцию 09Н
jmp return ; Конец
ck-on: display on ; См. функцию 09Н
Чтобы узнать дисковод, используемый для загрузки DOS,
можно добавить следующий код:
mov ah,33H
mov al,05H
int 21H
jc error
; в DL возвращен номер дисковода (1=А)
ПОЛУЧИТЬ ВЕКТОР ПРЕРЫВАНИЯ ( ФУНКЦИЯ 35Н )
Вызов: АН = 35Н
AL - номер прерывания
Возвращает: ES:BX - указатель на процедуру
прерывания
Комментарий:
Функция получает адрес указанного в AL прерывания из
таблицы векторов прерываний.
BX возвращает смещение (сегментный адрес в ES) процедуры
обработки прерывания.
Во избежание проблем совместимости ваших программ с
различными версиями системы, никогда не считывайте вектор
прерывания напрямую из памяти и никогда не вставляйте его
напрямую в таблицу векторов. Пользуйтесь функцией 25Н
(Установить вектор прерывания) для установки вектора, если
ваша программа не нуждается в совместимости с версиями системы
до 2.0.
- 81 -
Макроопределение:
get-vector macro interrupt
mov al,interrupt
mov ah,35H
int 21H
endm
Пример:
Следующая программа выводит на экран сегментный адрес и
смещение ( CS:IP ) процедуры обслуживания прерывания 25Н
(Читать диск абсолютно).
message db "Прерывание 25Н - CS:0000 IP:0000"
db 0DH,0AH,"$"
vec-seq db 2 dup (?)
vec-off db 2 dup (?)
;
begin: push es ; Сохранить ES
get-vector 25H ; Наша функция
mov ax,es ; Сегментный адрес в АХ
pop es ; Восстановить ES
convert ax,16,message[20] ; См. конец главы
convert bx,16,message[28] ; См. конец главы
display message ; См. функцию 09Н
ПОЛУЧИТЬ СВОБОДНОЕ ПРОСТРАНСТВО ДИСКА ( ФУНКЦИЯ 36Н )
Вызов: АН = 36Н
DL - дисковод (0=текущий, 1=А и т.д.)
Возвращает: АХ - 0FFFFH, если несуществующий
дисковод, иначе количество
секторов в кластере
BX - имеющиеся кластеры
СХ - количество байт в секторе
DX - количество кластеров на диске
Комментарий:
Функция 36Н возвращает количество кластеров, имеющихся на
диске из указанного дисковода и информацию, необходимую для
подсчета количества имеющихся байт на диске.
Если указан несуществующий дисковод, то AX возвращает
0FFFFH.
Эта функция заменила функции 1ВН и 1СН в ранних версиях
системы.
Макроопределение:
get-disk-space macro drive
mov dl,drive
mov ah,36H
int 21H
endm
- 82 -
Пример:
Следующая програма выводит на экран информацию о диске В.
message db " кластеров на диске В.",0DH,0AH
db " имеющихся кластеров.",0DH,0AH
db " секторов в кластере.",0DH,0AH
db " байт в секторе.",0DH,0AH,"$"
;
begin: get-disk-space 2 ; Наша функция
convert ax,10,message[55] ; См. конец главы
convert bx,10,message[28]
convert cx,10,message[83]
convert dx,10,message
display message ; См. функцию 09Н
ПОЛУЧИТЬ ИНФОРМАЦИЮ ПО СТРАНЕ ( ФУНКЦИЯ 38 )
Вызов: АН = 38Н
AL - 00H = текущая страна
1-0FEH = код страны
0FFH - BX содержит код страны
ВХ (если AL = 0FFH) - код страны
от 255 и выше
DS:DX - указатель на 32-байтовый
участок памяти
Возвращает: Флаг переноса установлен:
АХ - 2 = несуществующий
код страны
DS:DX - указатель на
32-байтовый участок
памяти
Флаг переноса сброшен:
ВХ - код страны
Комментарий:
Функция возвращает информацию по стране, которую система
использует для контроля клавиатуры и дисплея. Для получения
информации, в DX нужно загрузить смещение (сегментный адрес в
DS) 32-байтового участка памяти, куда возвращается информация.
( Для установки данных по стране, см. следующую функцию с
тем же номером - 38Н ).
AL содержит код страны:
AL Значение
__________________________________________________________
00Н Возвращает данные по стране, установленной в
качестве текущей
1-0FEH Возвращает данные по стране, идентифицированной
этим кодом
0FFH Возвращает данные по стране, код которой в ВХ
__________________________________________________________
Код страны должен быть загружен в ВХ, если он равен или
больше 255. Код страны обычно совпадает с международным
телефонным кодом.
Информация по стране возвращается в следующем формате:
- 83 -
Смещение
16 10 Название поля Длина в байтах
__________________________________________________________
00Н 0 Формат даты 2 (слово)
02Н 2 Символ валюты 5 (строка ASCIZ)
07Н 7 Разделитель тысяч 2 (строка ASCIZ)
09H 9 Десятичный разделитель 2 (строка ASCIZ)
0ВН 11 Разделитель даты 2 (строка ASCIZ)
0DH 13 Разделитель времени 2 (строка ASCIZ)
0FH 15 Поле битов 1
10Н 16 Денежные позиции 1
11Н 17 Формат времени 1
12Н 18 Адрес процедуры регист- 4 (двойное слово)
рового преобразования
16Н 22 Разделитель данных 2 (строка ASCIZ)
18Н 24 Зарезервировано 10
__________________________________________________________
Формат даты:
0 = США (месяц/день/год)
1 = Европа (день/месяц/год)
2 = Япония (год/месяц/день)
Поле битов:
Бит Значение
__________________________________________________________
0 0 Денежный символ предшествует числовому значению
1 Символ следует за числом
1 0 Нет пробелов между символом и числом
1 Один пробел между символом и числом
__________________________________________________________
Все остальные биты не определены.
Формат времени:
0 = 12-часовой
1 = 24-часовой
Денежные позиции:
Определяет количество позиций после десятичной точки в
обозначениях денежных сумм.
Адрес процедуры регистрового преобразования:
Указывает сегментный адрес и смещение FAR (дальней)
процедуры, которая преобразует символы из диапазона 80Н-0FFH
из нижнего регистра в верхний. Преобразуемый символ должен
быть в AL. Если есть такой код для этого символа, то он
возвращается в AL. Если кода по верхнему регистру нет, или
значение AL меньше 80Н, то значение AL остается неизменным.
Процедура изменяет только регистр флагов и AL.
В случае ошибки, устанавливается флаг переноса (CF), а
код ошибки возвращается в АХ:
- 84 -
Код Значение
__________________________________________________________
2 Несуществующий код страны (не предусмотрен в таблице).
Макроопределение:
get-macro macro country,buffer
local gc-01
mov dx,offset buffer
mov ax,country
cmp ax,0FFH
jl gc-01
mov al,0FFH
mov bx,country
gc-01: mov ah,38H
int 21h
endm
Пример:
Следующая программа выводит на экран время и дату в
соответствующем формате указанной страны , число 999.999 и
99/100 в качестве денежной суммы с правильными разделителями и
символом.
time db " : : ",5 dup (20),"$"
date db " / / ",5 dup (20),"$"
number db "999?999?99",0DH,0AH,"$"
data-area db 32 dup (?)
;
begin: get-country 0,data-area ; Наша функция
get-time ; См. функцию 2СН
byte-to-dec ch,time ; См. конец главы
byte-to-dec cl,time[03H] ;
byte-to-dec dh,time[06H] ;
get-date ; См. функцию 2АН
sub cx,1900 ; Нужны 2 последние
; цифры
byte-to-dec cl,date[06H] ; См. конец главы
cmp word ptr data-area,0 ; Проверить код
; страны
jne not-usa ; Это не США
byte-to-dec dh,date ; См. конец главы
byte-to-dec dl,date[03H] ; См. конец главы
jmp all-done ; Отобразить данные
not-usa: byte-to-dec dl,date ; См. конец главы
byte-to-dec dh,date[03H] ; См. конец главы
all-done: mov al,data-area[07H] ; Разделитель тысяч
mov number[03H],al ; поместить в NUMBER
mov al,data-area[09H] ; Десятичный разделитель
mov number[07H],al
display time ; См. функцию 09Н
display date ; См. функцию 09Н
display-char date-area[02H] ; См. функцию 02Н
display number ; См. функцию 09Н
- 85 -
УСТАНОВИТЬ ДАННЫЕ ПО СТРАНЕ ( ФУНКЦИЯ 38Н )
Вызов: АН = 38Н
DX = -1 (0FFFFH)
AL - код страны (меньше 255) или
0FFH, если код находится в ВХ
ВХ - (если AL = -1)
код страны ( 255 и выше )
Возвращает: Флаг переноса установлен:
АХ - 2 = несуществующий код
Флаг переноса сброшен:
нет ошибок
Комментарий:
Функция 38Н устанавливает код страны, который MS-DOS
использует для контроля клавиатуры и дисплея, или возвращает
данные по стране (см. предыдущую функцию с тем же номером). DX
должен содержать 0FFFFH. В AL должен быть загружен код страны,
меньший 255 или число 255 для индикации того, что код страны
загружен в ВХ.
Код страны обычно совпадает с международным телефооным
кодом. Описание данных по стране дается в комментарии к
предыдущей функции.
В случае ошибки, устанавливается флаг переноса, а AX
возвращает код ошибки:
Код Значение
__________________________________________________________
2 Несуществующий код страны (не предусмотрен в таблице)
Макроопределение:
set-country macro country
local sc-01
mov dx,0FFFFH
mov ax,country
cmp ax,0FFH
jl sc-01
mov bx,country
mov al,0FFH
sc-01: mov ah,38H
int 21H
endm
Пример:
Следующая программа устанавливает код Великобритании (44).
uk equ 44
;
begin: set-country uk ; Наша функция
jc error ; Метка не показана
- 86 -
СОЗДАТЬ КАТАЛОГ ( ФУНКЦИЯ 39Н )
Вызов: АН = 39Н
DS:DX - указатель на маршрут
Возвращает: Флаг переноса установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
5 = нет доступа
Флаг переноса сброшен:
нет ошибок
Комментарий:
Функция 39Н создает новый подкаталог. DX должен содержать
смещение (сегментный адрес в DS) строки ASCIZ, указывающей
маршрут нового подкаталога.
В случае ошибки устанавливается флаг переноса, а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
2 Файл не найден
3 Маршрут не найден
5 Нет места в родительском каталоге, файл с
таким же именем уже существует в текущем
каталоге или маршрут указывает на устойство
__________________________________________________________
Макроопределение:
make-dir macro path
mov dx,offset path
mov ah,39H
int 21H
endm
Пример:
Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В и делает его текущим. После
этого она опять делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится текущий
каталог для подтверждения изменений.
old-path db "b:
new-path db "b:\new-dir",0
buffer db "b:
;
begin: get-dir 2,old-path[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz old-path ; См. конец главы
make-dir new-path ; Наша функция
jc error-make ; Метка не показана
change-dir new-path ; См. функцию 3ВН
jc error-change ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
change-dir old-path ; См. функцию 3ВН
jc error-change ; Метка не показана
- 87 -
rem-dir new-path ; См. функцию 3АН
jc error-rem ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
УДАЛИТЬ КАТАЛОГ ( ФУНКЦИЯ 3АН )
Вызов: АН = 3АН
DS:DX - указатель на маршрут
Возвращает: Флаг переноса установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
5 = нет доступа
16 = текущий каталог
Флаг переноса сброшен:
нет ошибок
Комментарий:
Функция 3АН удаляет подкаталог. DX должен содержать
смещение (сегментный адрес в DS) строки ASCIZ, указывающей
маршрут подкаталога, который вы хотите удалить.
Подкаталог не должен содержать файлов. Вы не можете
уничтожить текущий каталог. В случае ошибки, устанавливается
флаг переноса, а АХ возвращает код ошибки:
Код Значение
__________________________________________________________
2 Файл не найден
3 Маршрут не найден
5 Каталог не пустой, маршрут не указывает на
каталог, маршрут указывает на корневой каталог
или он не разрешен
16 Маршрут указывает на текущий каталог
__________________________________________________________
Макроопределение:
rem-dir macro path
mov dx,offset path
mov ah,3AH
int 21H
endm
Пример:
Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В и делает его текущим. После
этого она опять делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится текущий
каталог для подтверждения изменений.
old-path db "b:
new-path db "b:\new-dir",0
buffer db "b:
;
begin: get-dir 2,old-path[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
- 88 -
display-asciz old-path ; См. конец главы
make-dir new-path ; См. функцию 39Н
jc error-make ; Метка не показана
change-dir new-path ; См. функцию 3ВН
jc error-change ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
change-dir old-path ; См. функцию 3ВН
jc error-change ; Метка не показана
rem-dir new-path ; Наша функция
jc error-rem ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
СМЕНИТЬ ТЕКУЩИЙ КАТАЛОГ ( ФУНКЦИЯ 3ВН )
Вызов: АН = 3ВН
DS:DX - указатель на маршрут
Возвращает: Флаг переноса установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
Флаг переноса сброшен:
нет ошибок
Комментарий:
Функция 3ВН меняет текущий каталог. DX должен содержать
смещение (сегментный адрес в DS) строки ASCIZ, указывающей
маршрут нового текущуго каталога.
Длина строки ограничена 64 символами.
Если любой компонент маршрута отсутствует, маршрут не
меняется. В случае ошибки, устанавливается флаг переноса, а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
2 Файл не найден
3 Маршрут либо не существует, либо указывает на
файл, а не на каталог
__________________________________________________________
Макроопределение:
change-dir macro path
mov dx,offset path
mov ah,3BH
int 21H
endm
Пример:
Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В и делает его текущим. После
этого она опять делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится текущий
каталог для подтверждения изменений.
- 89 -
old-path db "b:
new-path db "b:\new-dir",0
buffer db "b:
;
begin: get-dir 2,old-path[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz old-path ; См. конец главы
make-dir new-path ; См. функцию 39Н
jc error-make ; Метка не показана
change-dir new-path ; Наша функция
jc error-change ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
change-dir old-path ; См. функцию 3ВН
jc error-change ; Метка не показана
rem-dir new-path ; См. функцию 3АН
jc error-rem ; Метка не показана
get-dir 2,buffer[03H] ; См. функцию 47Н
jc error-get ; Метка не показана
display-asciz buffer ; См. конец главы
СОЗДАТЬ ХЕНДЛ ( ФУНКЦИЯ 3СН )
Вызов: АН = 3СН
DS:DX - указатель на маршрут
СХ - атрибут файла
Возвращает: Флаг переноса установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
4 = слишком много
открытых файлов
5 = нет доступа
Флаг переноса сброшен:
АХ - хендл
Комментарий:
Функция 3СН создает файл и назначает его первому
доступному хендлу. DX должен содержать смещение (сегментный
адрес в DS) строки ASCIZ , указывающей маршрут создаваемого
файла. СХ должен содержать атрибут, присваиваемый файлу
(подробнее, см. начало этой главы " Атрибуты файла ").
Если указанный файл не существует, то функция создает
его. Если такой файл уже существует, то его длина сбрасывается
в ноль. После этого файлу присваивается атрибут, указанный в
СХ, и он открывается для чтения/записи. АХ возвращает хендл
файла.
В случае ошибки, устанавливается флаг переноса (CF), а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
2 Файл не найден
3 Несуществующий маршрут
4 Слишком много открытых файлов (нет больше хендлов)
5 Каталог заполнен, каталог с таким же именем уже
существует или уже существует файл с таким же именем,
имеющий более ограничивающие атрибуты
- 90 -
Макроопределение:
create-handle macro path,attrib
mov dx,offset path
mov cx,attrib
mov ah,3CH
int 21H
endm
Пример:
Следующая программа создает файл dir.tmp, содержащий
имена и расширения всех файлов из текущего каталога диска В.
srch-file db "b:*.*",0
tmp-file db "b:dir.tmp",0
buffer db 43 dup (?)
handle dw ?
;
begin: set-dta buffer ; См. функцию 1АН
find-first-file srch-file,16H ; См. функцию 4ЕН
cmp ax,12H ; Каталог пуст?
je all-done ; Да, возврат
create-handle tmp-file,0 ; Наша функция
jc error ; Метка не показана
mov handle,ax ; Сохранить хендл
write-it: write-handle handle,buffer[1EH],12 ;Функция 40Н
find-next-file ; См. функцию 4FH
cmp ax,12H ; Другой вход?
je all-done ; Нет, возврат
jmp write-it ; Да, сделать запись
all-done: close-handle handle ; См. функцию 3ЕН
ОТКРЫТЬ ХЕНДЛ ( ФУНКЦИЯ 3DH )
Вызов: АН = 3DH
AL - код доступа (см. текст)
DS:DX - указатель на маршрут
Возвращает: Флаг переноса установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
4 = слишком много
открытых файлов
5 = нет доступа
12 = не разрешенный доступ
Флаг переноса сброшен:
нет ошибок
Комментарий:
Функция 3DH открывает любые файлы, включая скрытые и
истемные, для ввда/вывода. DX должен содержать смещение
(сегментный адрес в DS) строки ASCIZ, указывающей маршрут
открываемого файла. В AL загружается код доступа (см. ниже).
В случае успешного завершения операции, АХ возвращает
хендл файла. MS-DOS устанавливает указатель чтение/запись на
первый байт файла.
- 91 -
Управление доступом к файлу:
Значение регистра AL состоит из трех полей, определяющих,
открывается ли файл для чтения, записи или для чтение/запись
(код доступа); какой доступ к этому файлу имеют другие
программы (режим разделения); и унаследован ли файл дочерней
программой (бит наследования).
Биты Название поля
_________________________
0-3 Код доступа
4-6 Режим разделения
7 Бит наследования
_________________________
Бит наследования:
Если этот бит сброшен, то файл унаследован программой,
созданной с помощью функции 4ВН (Загрузить и выполнить
программу или наложить).
Режим разделения:
Биты этого поля могут иметь следующие значения:
Таблица 1.21
Значения битов поля Режим разделения
__________________________________________________________
Биты Режим Описание
__________________________________________________________
000 Совместимость На данной машине, с этим режимом
любая программа МОЖЕТ открыть
файл, любое количество раз.
Не может, если файл был открыт с
любым другим режимом разделения.
001 Запрещение Не может, если файл был открыт в
чтения/записи режиме совместимости или с дос-
тупом по чтению или записи.
( Даже если файл был открыт
текущей программой).
010 Запрещение Не может, если файл был открыт в
записи режиме совместимости или с дос-
тупом по записи любой другой
программой.
011 Запрещение Не может, если файл был открыт в
чтения режиме совместимости или с дос-
тупом по чтению любой другой
программой.
100 Разрешение Не может, если файл был открыт в
чтения/записи режиме совместимости любой
другой программой.
__________________________________________________________
Код доступа:
Биты этого поля определяют использование открываемого
файла и могут иметь следующие значения:
- 92 -
Таблица 1.22
Значения битов поля Код доступа
__________________________________________________________
Биты Доступ Описание
__________________________________________________________
0000 Чтение Невозможен, если файл был открыт в режиме
запрещения чтения или запрещения
чтения/записи.
0001 Запись Невозможен, если файл был открыт в режиме
запрещения записи или запрещения
чтения/записи.
0010 Чтение/ Невозможен, если файл был открыт в режи-
Запись мах запрещения чтения, запрещения записи
или запрещения чтения/записи.
__________________________________________________________
В случае ошибки, устанавливается флаг переноса, а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
2 Указанный файл не разрешен или не существует
3 Указанный маршрут не разрешен или не существует
4 Нет больше свободных хендлов в текущей программе
или заполнены внутренние системные таблицы.
5 Программа пыталась открыть каталог или метку
тома или была попытка открыть для записи файл,
который создан только для чтения.
12 Код доступа (биты 0-3 в AL) не равен 0,1 или 2.
__________________________________________________________
В случае возникновения ошибки в режиме разделения при
вызове этой функции, MS-DOS вызывает прерывание 24Н с кодом
ошибки 2 (Дисковод не готов). Последующая функция 59Н
(Получить расширенный код ошибки) возвращает расширенный
код ошибки, уточняющий вид нарушения соглашений системы
разделения файлов.
При открытии файла, важно сообщать системе о всех
операциях, проводимых другими программами над этим файлом
(режим разделения). Режим по умолчанию (режим совместимости)
запрещает доступ к файлу другим программам до тех пор, пока
они не откроют этот файл в режиме совместимости.
Макроопределение:
open-handle macro path,access
mov dx,offset path
mov al,access
mov ah,3DH
int 21h
endm
Пример:
Следующая программа выводит файл textfile.asc с диска В.
file db "b:textfile.asc",0
buffer db ?
handle dw ?
;
- 93 -
begin: open-handle file,0 ; Наша функция
mov handle,ax ; Сохранить хендл
read-char: read-handle handle,buffer,1 ; Читать 1 символ
jc error-read ; Метка не показана
cmp ax,0 ; Конец файла?
je return ; Да, возврат
print-char buffer ; См. функцию 05Н
jmp read-char ; Читать следующий
ЗАКРЫТЬ ХЕНДЛ ( ФУНКЦИЯ 3ЕН )
Вызов: АН = 3ЕН
ВХ - хендл
Возвращае: CF установлен:
АХ = 6 - несуществующий
хендл
CF сброшен:
нет ошибок
Комментарий:
Функция 3ЕН закрывает файл, открытый с помощью функции
3DH (Открыть хендл) или 3СН (Создать хендл). ВХ должен
содержать хендл открытого файла, который вы хотите закрыть.
Если нет ошибок, то MS-DOS закрывает файл и сносит все
внутренние буферы. В случае ошибки, устанавливается флаг
переноса, а АХ возвращает код ошибки:
Код Значение
__________________________________________________________
6 Хендл не открыт или не существует
Макроопределение:
close-handle macro handle
mov bx,handle
mov ah,3EH
int 21H
endm
Пример:
Следующая программа создает файл dir.tmp, содержащий
имена и расширения всех файлов из текущего каталога диска В.
srch-file db "b:*.*",0
tmp-file db "b:dir.tmp",0
buffer db 43 dup (?)
handle dw ?
;
begin: set-dta buffer ; См. функцию 1АН
find-first-file srch-file,16H ; См. функцию 4ЕН
cmp ax,12H ; Каталог пуст?
je all-done ; Да, возврат
create-handle tmp-file,0 ; См. функцию 3СН
jc error ; Метка не показана
mov handle,ax ; Сохранить хендл
write-it: write-handle handle,buffer[1EH],12 ;Функция 40Н
find-next-file ; См. функцию 4FH
- 94 -
cmp ax,12H ; Другой вход?
je all-done ; Нет, возврат
jmp write-it ; Да, сделать запись
all-done: close-handle handle ; Наша функция
jc error-close ; Метка не показана
ЧИТАТЬ ХЕНДЛ ( ФУНКЦИЯ 3FH )
Вызов: AH = 3FH
BX - хендл
СХ - количество байт для чтения
DS:DX - указатель на буфер
Возвращает: CF установлен:
АХ - 5 = нет доступа
6 = несуществующий хендл
CF сброшен:
АХ - прочитано байт
Комментарий:
Функция 3FH читает из файла или устройства,
ассоциированного с указанным хендлом. ВХ должен содержать
хендл. СХ - количество байт, которое нужно прочитать. DX
содержит смещение (сегментный адрес в DS) буфера.
Количество байт, указанное в СХ, необязательно
переносится в буфер. Если вы используете эту функцию для
чтения с клавиатуры, например, то данные читаются только до
первого ВК.
Если вы используете функцию для чтения со стандартного
ввода, то вы можете переадресовать его.
В случае ошибки устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
5 Хендл не открыт для чтения
6 Хендл не открыт или хендл не существует
Макроопределение:
read-handle macro handle,buffer,bytes
mov bx,handle
mov dx,offset buffer
mov cx,bytes
mov ah,3FH
int 21H
endm
Пример:
Следующая программа выводит на экран файл textfile.asc с
диска В.
filename db "B:\textfile.asc",0
buffer db 129 dup (?)
handle db ?
;
begin: open-handle filename,0 ; См. функцию 3DH
jc error-open ; Метка не показана
mov handle,ax ; Сохранить хендл
- 95 -
read-file: read-handle buffer,file-handle,128 ;
jc error-open ; Метка не показана
cmp ax,0 ; Конец файла?
je return ; Да, возврат
mov bx,ax ; Кол-во прочитанных
; байт
mov buffer[bx],"$" ; Закончить строку
display buffer ; См. функцию 09Н
jmp read-file ; Читать дальше
ЗАПИСАТЬ В ХЕНДЛ ( ФУНКЦИЯ 40Н )
Вызов: АН = 40Н
ВХ - хендл
СХ - количество байт для записи
DS:DX - указатель на буфер
Возвращает: CF установлен:
АХ - 5 = нет доступа
6 = несуществующий
хендл
CF сброшен:
АХ - количество записанных
байт
Комментарий:
Функция 40Н записывает в файл или устройство,
ассоциированное с указанным хендлом. ВХ должен содержать
хендл. В СХ нужно загрузить количество записываемых байт. DX
содержит смещение (сегментный адрес в DS) этих данных.
Если сбросить СХ в ноль, то файл будет сужен до текущей
позиции указателя файла. MS-DOS не выполнит операцию записи,
если хендл открыт только для чтения.
Если нет ошибки, то АХ возвращает количество записанных
байт. Не забывайте проверять содержимое АХ после операции
записи. Если оно меньше величины, загруженной в СХ, то
произошла ошибка, даже если сброшен флаг переноса. Если АХ
содержит 0, а адресатом был файл на диске, то это признак
переполнения диска. Если с помощью этой функции вы
записываете на стандартный вывод, то вы можете переадресовать
его.
В случае ошибки , устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
_____________________________________
5 Хендл не открыт для записи
6 хендл не открыт или не существует
Макроопределение:
write-handle macro handle,buffer,bytes
mov bx,handle
mov dx,offset buffer
mov cx,bytes
mov ah,40H
int 21H
endm
- 96 -
Пример:
Следующая программа создает файл dir.tmp, содержащий
имена и расширения всех файлов из текущего каталога диска В.
srch-file db "b:*.*",0
tmp-file db "b:dir.tmp",0
buffer db 43 dup (?)
handle dw ?
;
begin: set-dta buffer ; См. функцию 1АН
find-first-file srch-file,16H ; См. функцию 4ЕН
cmp ax,12H ; Каталог пуст?
je all-done ; Да, возврат
create-handle tmp-file,0 ; См. функцию 3СН
jc error ; Метка не показана
mov handle,ax ; Сохранить хендл
write-it: write-handle handle,buffer[1EH],12 ;Наша функция
find-next-file ; См. функцию 4FH
cmp ax,12H ; Другой вход?
je all-done ; Нет, возврат
jmp write-it ; Да, сделать запись
all-done: close-handle handle ; См. функцию 3ЕН
jc error-close ; Метка не показана
УДАЛИТЬ КАТАЛОГОВЫЙ ВХОД [РАЗЪЕДЕНИТЬ] ( ФУНКЦИЯ 41Н )
Вызов: АН = 41Н
DS:DX - указатель на маршрут
Возвращает: CF установлен:
АХ - 2 = файл не найден
3 = маршрут не найден
5 = нет доступа
CF сброшен:
нет ошибок
Комментарий:
Функция 41Н стирает файл путем удаления его каталогового
входа. DX должен содержать смещение (сегментный адрес в DS)
строки ASCIZ, указывающей маршрут удаляемого файла. Нельзя
использовать символы заполнители.
Если файл существует и не только для чтения, функция
удаляет его. В противном случае, устанавливается CF, а АХ
возвращает код ошибки:
Код Значение
______________________________________________
2 Файл не существует или указан каталог
3 Несуществующий маршрут
5 файл только для чтения
Для удаления файла с атрибутом Только для чтения, надо
сбросить его атрибут в ноль с помощью функции 43Н
(Установить/получить атрибуты файла).
- 97 -
Макроопределение:
delete-entry macro path
mov dx,offset path
mov ah,41H
int 21H
endm
Пример:
Следующая программа удаляет все файлы с диска В,
последняя запись в которые делалась до 31 Декабря 1982 года.
year dw 1982
month db 12
day db 31
files db 0
message db "Удаленных файлов нет.".0DH,0AH,"$"
path db "b;*.*",0
buffer db 43 dup (?)
;
begin: set-dta buffer ; См. функцию 1АН
select-disk "B" ; См. функцию 0ЕН
find-first-file path,0 ; См. функцию 11Н
jnc compare ; Получили один
jmp all-done ; Нет, нет файлов на диске
compare: convert-date buffer[-1] ; См. конец главы
cmp cx,year ; Следующие строки сравни-
jg next ; вают дату в каталоговом
cmp dl,month ; входе с указанной датой
jg next
cmp dh,day
jge next
delete-entry buffer[1EH] ; Наша функция
jc error-delete ; Метка не показана
inc files ; Увеличить счетчик
; файлов
next: find-next-file ; См. функцию 12Н
jnc compare ; Да, проверить дату
cmp files,0 ; Есть удаленные файлы?
je all-done ; Нет, сообщить об этом
convert files,10,message ; См. конец главы
all-done: display message ; См. функцию 09Н
select-disk "A" ; См. функцию 0ЕН
СДВИНУТЬ УКАЗАТЕЛЬ ФАЙЛА ( ФУНКЦИЯ 42Н )
Вызов: АН = 42Н
AL - метод сдвига
ВХ - хендл
СХ:DX - расстояние в байтах (смещение)
Возвращает: CF установлен:
АХ - 1 = несуществующий
код сдвига
6 = несуществующий
хендл
CF сброшен:
DX:AX - новое положение
указателя
- 98 -
Комментарий:
Функция 42Н перемещает указатель чтения/записи файла,
ассоциированного с указанным в ВХ хендлом. В СХ:DX находится
( в СХ старшее слово) 32-битовое смещение. AL содержит
код сдвига указателя:
Код Указатель перемещается на
___________________________________
0 начало файла плюс смещение
1 текущую позицию плюс смещение
2 конец файла плюс смещение
DX:AX возвращают новое положение указателя ( в DX старшее
слово). Определить длину файла можно путем загрузки в CX:DX
нуля, а в AL - 2. В этом случае DX:AX вернет смещение байта,
следующего за последним байтом файла (размер файла в байтах).
В случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
________________________
1 AL не 0,1 или2
6 хендл не открыт
Макроопределение:
move-ptr macro handle,high,low,method
mov bx,handle
mov cx,high
mov dx,low
mov al,method
mov ah,42H
int 21h
endm
Пример:
Следующая программа запрашивает букву, преобразует
введенную букву в ее порядковый номер в алфавите, затем читает
и выводит на экран соответствующую запись из файла с именем
alphabet.dat, находящегося на диске В. Файл содержит 26
записей, каждая длиной 28 байт.
file db "b:alphabet.dat",0
buffer db 28 dup (?),"$"
prompt db "Введите букву: $"
crlf db 0DH,0AH,"$"
handle db ?
record-length db ?
;
begin: open-handle file,0 ; См. функцию 3DH
jc error-open ; Метка не показана
mov handle,ax ; Сохранить хендл
get-char: display prompt ; См. функцию 09Н
read-kbd-and-echo ; См. функцию 01Н
sub al,41H ; Преобразовать код ASCII
; в номер записи
mul byte ptr record-length ; Получить
; смещение
move-ptr handle,0,ax,0 ; Наша функция
- 99 -
jc error-move ; Метка не показана
read-handle handle,buffer,record-length
jc error-read ; Метка не показана
cmp ax,0 ; Конец файла?
je return ; Да, возврат
display crlf ; См. функцию 09Н
display buffer ; См. функцию 09Н
display crlf ; См. функцию 09Н
jmp get-char ; Получить следующий символ
ПОЛУЧИТЬ/УСТАНОВИТЬ АТРИБУТЫ ФАЙЛА ( ФУНКЦИЯ 43Н )
Вызов: АН = 43Н
AL - 0 = получить атрибуты
1 = установить атрибуты
СХ (если AL = 1) - атрибуты
DS:DX - указатель на маршрут
Возвращает: CF установлен:
АХ - 1 = несуществующая
функция
2 = файл не найден
3 = маршрут не найден
5 = нет доступа
CF (флаг переноса) сброшен:
СХ - байт атрибута (если AL=0)
Комментарий:
Функция 43Н возвращает или устанавливает атрибуты файла.
DX должен содержать смещение (сегментный адрес в DS) строки
ASCIZ, указывающей маршрут файла. Содержимое AL определяет вид
операции (0=получить, 1=установить).
Если AL равно 0, то байт атрибута возвращается в СХ. Если
AL равно 1, то байт атрибута устанавливается из СХ
(см. Раздел 1.5.5 "Атрибуты файла").
Вы не можете изменить бит метка тома (08Н) или бит
Подкаталога (10Н) в байте атрибута спомощью этой функции.
В случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
1 AL не 0 и не 1
2 Нет такого файла
3 Несуществующий маршрут
5 Неизменяемый атрибут (Подкаталог или метка тома)
Макроопределение:
change-attr macro path,action,attrib
mov dx,offset path
mov al,action
mov cx,attrib
mov ah,43H
int 21H
endm
- 100 -
Пример:
Следующая програама выводит на экран атрибуты,
присвоенные файлу report.asm , находящемся в текущем каталоге
на диске В.
header db 15 dup (20H),"Читать",0DH,0AH
db "Имя файла только Скрытый "
db "Системный Том Подкаталог Архив"
db 0DH,0AH,0DH,0AH,"$"
path db "b:report.asm",3 dup (0),"$"
attribute dw ?
blanks db 9 dup (20H),"$"
;
begin: change-attr path,0,0 ; Наша функция
jc error-mode ; Метка не показана
mov attribute,cx ; Сохранить байт
; атрибута
display header ; См. функцию 09Н
display path ; См. функцию 09Н
mov cx,6 ; Проверить 6 бит
mov bx,1 ; Начать с бита 0
chk-bit: test attribute,bx ; Бит установлен?
jz no-attr ; Нет
display-char "X" ; См. функцию 02Н
jmp short next-bit ; С этим битом все
no-attr: display-char 20H ; См. функцию 02Н
next-bit: display blanks ; См. функцию 09Н
shl bx,1 ; Сместить к следую-
; щему биту
loop chk-bit ; Проверить его
УВВ ДАННЫЕ ( ФУНКЦИЯ 44Н, КОДЫ 0 и 1 )
Вызов: АН = 44Н
AL - 0 = получить данные устройства
1 = установить данные устройства
ВХ - хендл
DX - данные устройства (см. текст)
Возвращает: CF установлен:
АХ - 1 = несуществующая
функция
6 = несуществующий
хендл
CF сброшен:
DX - данные устройства
Комментарий:
Функция 44Н (коды 0 и 1) либо устанавливает, либо
возвращает данные, которые MS-DOS использует для управления
устройством. Если AL равно 1 (установить), то DH должен
содержать 0.
Данные устройства загружаются или возвращаются в DX. Если
бит 7 данных равен 1, то хендл относится к устройству, а
остальные биты имеют следующие значения:
- 101 -
Таблица 1.23
Значения битов данных
__________________________________________________________
Бит Значение
__________________________________________________________
0 1 Консоль ввода
1 1 Консоль вывода
2 1 Нулевое устройство
3 1 Синхронное устройство
4 1 Зарезервировано
5 1 Нет проверки на управляющие символы
0 Есть проверка на управляющие символы
6 0 Конец файла на вводе
8-10 Зарезервировано
11 1 Устройство различает открыть/закрыть
12 Зарезервировано
13 1 Устройство поддерживает вывод, если
оно не занято
14 1 Устройство может обрабатывать управляющие
последовательности, посылаемые функцией
44Н (коды 2 и 3). Этот бит может быть
только прочитан, но не установлен
15 1 Зарезервировано
__________________________________________________________
Вы должны сбросить зарезервированные биты в ноль.
Управляющие символы, подразумеваемые в описании бита 5 -
CONTROL+C, CONTROL+P, CONTROL+S и CONTROL+Z. Для чтения этих
символов, не в качестве управляющих, вам нужно установить бит
5 и использовать либо функцию 33Н (Проверка по CONTROL+C),
либо команду MS-DOS BREAK для отмены проверки.
Если бит 7 в DX равен 0, то хендл относится к файлу, а
остальные биты имеют следующие значения:
Бит Значение
__________________________________________________________
0-5 Номер дисковода (0=А, 1=В и т.д.)
6 0 Файл был записан
8-15 Зарезервировано
__________________________________________________________
В случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
1 AL не 0 и не 1 или AL = 1, a DH не 0
6 Хендл, указанный в ВХ, не открыт или не существует
__________________________________________________________
Макроопределение:
ioctl-data macro code,handle
mov bx,handle
mov al,code
mov ah,44H
int 21H
endm
- 102 -
Пример:
Следующая программа получает данные устройства
стандартного вывода, устанавливает бит проверки на управляющие
символы (бит 5), а затем опять его сбрасывает.
get equ 0
set equ 1
stdout equ 1
;
begin: ioctl-data get,stdout ; Наша функция
jc error ; Метка не показана
mov dh,0 ; Сброс DH
or dh,20H ; Установить бит 5
ioctl-data set,stdout ; Наша функция
jc error ; Метка не показана
; Теперь управляющие символы рассматриваются как обычные
; данные ( " Сырой режим " )
ioctl-data get,stdout ; Наша функция
jc error ; Метка не показана
mov dh,0 ; Сброс DH
and dl,0DFH ; Сброс бита 5
ioctl-data set,stdout ; Наша функция
; Теперь эти символы интерпретируются как управляющие
; ( " Приготовленный режим" )
УВВ СИМВОЛ ( ФУНКЦИЯ 44Н, КОДЫ 2 и 3 )
Вызов: АН = 44Н
AL - 2 = передать управляющие данные
3 = получить управляющие данные
ВХ - хендл
СХ - количество байт для чтения/записи
DS:DX - указатель на буфер
Возвращает: CF установлен:
АХ - 1 = несуществующая функция
6 = несуществующий хендл
CF сброшен:
АХ - количество переданных
байт
Комментарий:
Функция 44Н (коды 2 и 3) передает или получает
управляющие данные в/из устройство(а) символьной обработки. AL
должен содержать 2 для передачи и 3 для получения данных. В ВХ
должен быть загружен хендл символьного устройства, например
принтера или последовательного порта. СХ содержит количество
байт для чтения или записи, а DS:DX адрес буфера данных.
АХ возвращает количество переданных байт. Драйвер
устройства должен поддерживать интерфейс IOCtl (УВВ).
В случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
1 AL не 2 и не 3 или устройство не может выполнить
указанную функцию
6 Указанный в ВХ хендл не открыт или не существует
__________________________________________________________
- 103 -
Макроопределение:
ioctl-char macro code,handle,buffer
mov bx,handle
mov dx,offset buffer
mov al,code
mov ah,44H
int 21H
endm
Пример:
Типичного примера нет, так как обработка управляющих
данных зависит от используемого устройства и, конечно,
драйвера устройства.
УВВ БЛОК ( ФУНКЦИЯ 44Н, КОДЫ 4 и 5 )
Вызов: АН = 44Н
AL - 4 = передать управляющие данные
5 = получить управляющие данные
BL - номер дисковода
( 0=текущий, 1=А и т.д.)
СХ - количество байт для чтения/записи
DS:DX - указатель на буфер
Возвращает: CF установлен:
АХ - 1 = несуществующая функция
5 = несуществующий
дисковод
CF сброшен:
АХ - количество переданных
байт
Комментарий:
Функция 44Н (коды 4 и 5) передает или получает
управляющие данные с/на устройства блоковой обработки. AL
должен содержать 4 для передачи данных и 5 для получения. В ВХ
необходимо загрузить номер дисковода (0=текущий, 1=А и т.д.),
а в СХ количество байт для чтения или записи. DS:DX содержат
сегментный адрес и смещение буфера данных.
АХ возвращает количество переданных байт. Драйвер
устройства должен поддерживать интерфейс IOCtl (УВВ). Чтобы
определить, так ли это, используйте функцию 44Н с кодом 0 для
получения данных устройства, а затем проверьте бит 14. Если он
установлен, то драйвер поддерживает УВВ.
В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
1 AL не 4 и не 5, или устройство не может выполнить
указанную функцию
5 Указанный в BL номер дисковода не существует
__________________________________________________________
- 104 -
Макроопределение:
io-status macro code,drive,buffer
mov bl,drive
mov dx,offset buffer
mov al,code
mov ah,44H
int 21H
endm
Пример:
Типичного примера нет, так как обработка управляющих
данных зависит от используемого устройства и, конечно,
драйвера устройства.
УВВ СТАТУС ( ФУНКЦИЯ 44Н, КОДЫ 6 и 7 )
Вызов: АН = 44Н
AL - 6 = готовность на ввод
7 = готовность на вывод
ВХ - хендл
Возвращает: CF установлен:
АХ - 1 = несуществующая функция
5 = нет доступа
6 = несуществующий хендл
13 = неразрешенные данные
CF сброшен:
AL - 00H = не готов
0FFH = готов
Комментарий:
Функция 44Н (коды 6 и 7) проверяет готовность файла или
устройства, ассоциированного с указанным хендлом. AL должен
содержать 6, если проверяется готовность для ввода или 7, если
проверяется готовность для вывода. ВХ указывает хендл.
AL возвращает состояние :
Значение Для устройства Для файла
вводимого выводимого
__________________________________________________________
00Н Не готово Указатель в Готов
конце файла
0FFH Готово Готов Готов
__________________________________________________________
Выводимый файл всегда готов, даже если диск переполнен.
В случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:
- 105 -
Код Значение
__________________________________________________________
1 AL не 6 и не 7
5 Нет доступа
6 Содержащийся в ВХ номер не является разрешенным,
открытым хендлом
13 Неразрешенные данные
__________________________________________________________
Макроопределение:
ioctl-status macro code,handle
mov bx,handle
mov al,code
mov ah,44H
int 21H
endm
Пример:
Следующая программа выводит на экран результат проверки
файла, ассоциированного с хендлом 6, на готовность к вводу.
stdout equ 1
;
message db "Файл "
ready db "готов."
at-eof db "не готов."
crlf db 0DH,0AH
;
begin: write-handle stdout,message,5 ; На экран message
jc write-error ; Метка не показана
ioctl-status 6 ; Наша функция
jc ioctl-error ; Метка не показана
cmp al,0 ; Проверить статус
jne not-eof ; Файл готов?
write-handle stdout,at-eof,9 ; См. функцию 40Н
jc write-error ; Метка не показана
jmp all-done ; Конец
not-eof: write-handle stdout,ready,6 ; См. функцию 40Н
all-done: write-handle stdout,crlf,2 ; См. функцию 40Н
jc write-error ; Метка не показана
УВВ СМЕННЫЙ ( ФУНКЦИЯ 44Н, КОД 08Н )
Вызов: АН = 44Н
AL = 08H
BL - номер дисковода
( 0=текущий, 1=А и т.д.)
Возвращает: CF установлен:
АХ - 1 = несуществующая функция
15 = несуществующий
дисковод
CF сброшен:
АХ - 0 = сменный
1 = не сменяемый
- 106 -
Комментарий:
Функция 44Н (код 08Н) проверяет, содержит ли дисковод
сменяемый диск или же это фиксированный диск. ВХ должен
содержать номер дисковода. АХ возвращает 0, если диск
сменяемый, в противном случае единицу.
Эта функция позволяет программам определить, нужно ли
выдавать на экран сообщение о смене диска.
В случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
1 Устройство не поддерживает эту функцию
15 Содержимое BL не является разрешенным номером
дисковода
__________________________________________________________
Макроопределение:
ioctl-change macro drive
mov bl,drive
mov al,08H
mov ah,44H
int 21H
endm
Пример:
Следующая программа проверяет, содержит ли текущий
дисковод сменный диск. Если нет, то программа продолжается;
если да, то программа запрашивает пользователя сменить диск в
текущем дисководе.
stdout equ 1
;
message db "Смените пожалуйста диск"
drives db "ABCD"
crlf db 0DH,0AH
;
begin: ioctl-change 0 ; Наша функция
jc ioctl-error ; Метка не показана
cmp ax,0 ; Текущий диск
; сменяемый?
jne continue ; Нет, продолжить
write-handle stdout,message,23 ; См. функцию 40Н
jc write-error ; Метка не показана
current-disk ; См. функцию 19Н
xor bx,bx ; Сброс индекса
mov bl,al ; Получить текущий
; дисковод
display-char drives[bx] ; См. функцию 02Н
write-handle stdout,crlf,2 ; См. функцию 40Н
jc write-error ; Метка не показана
continue:
; Продолжение программы
- 107 -
УВВ. ОПРЕДЕЛИТЬ НАЗНАЧЕНИЕ ИМЕНИ ( ФУНКЦИЯ 44Н, КОД 09Н )
Вызов: АН = 44Н
AL = 09H
BL - номер дисковода
( 0=текущий, 1=А и т.д.)
Возвращает: CF установлен:
АХ - 1 = несуществующий код
функции
15 = несуществующий номер
дисковода
CF сброшен:
DX - биты атрибута устройства
Комментарий:
Функция 44Н (код 09Н) проверяет, относится ли имя
дисковода к дисководу на рабочей станции сети Microsoft
Networks ( локальный ), или оно относится к дисководу,
переназначеному серверу ( удаленный ). BL должен содержать
номер дисковода.
Если блоковое устройство - локальный дисковод, DX
возвращает слово атрибута из заголовка устройства. Если им
является удаленный дисковод, то устанавливается только бит 12
(1000Н), а остальные - нули (зарезервированы).
Прикладным программам не следует тестировать бит 12, т.к.
им не надо различать локальные и удаленные устройства.
Программы должны быть написаны так, чтобы обеспечивалась
независимость от положения устройств.
В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
1 Для этого системного вызова должна быть загружена
процедура разделения файла
15 Содержимое BL не является разрешенным номером
дисковода
__________________________________________________________
Макроопределение:
ioctl-rblock macro drive
mov bl,drive
mov al,09H
mov ah,44H
int 21H
endm
Пример:
Следующая программа проверяет, является ли дисковод В
локальным или удаленным, и выводит соответствующее сообщение.
stdout equ 1
;
message db "Дисковод В: - "
- 108 -
loc db "локальный."
rem db "удаленный."
crlf db 0DH,0AH
;
begin: write-handle stdout,message,14 ; На экран message
jc write-error ; Метка не показана
ioctl-rblock 2 ; Наша функция
jc ioctl-error ; Бит 12 установлен?
test dx,1000H ; Да, это удаленный
jnz not-loc ; Метка не показана
; См. функцию 40Н
write-handle stdout,loc,10 ;
jc write-error ; Метка не показана
jmp done ; Конец
not-loc: write-handle stdout,rem,10 ; См. функцию 40Н
jc write-error ; Метка не показана
done: write-handle stdout,crlf,2 ; См. функцию 40Н
jc write-error ; Метка не показана
УВВ. ОПРЕДЕЛИТЬ НАЗНАЧЕНИЕ ХЕНДЛА ( ФУНКЦИЯ 44Н, КОД 0АН )
Вызов: АН = 44Н
AL = 0AH
BX - хендл
Возвращает: CF установлен:
АХ - 1 = несуществующий код
функции
6 = несуществующий хендл
CF сброшен:
DX - поле битов УВВ
Комментарий:
Функция 44Н (код 0АН) проверяет, относится ли хендл к
файлу или к устройству на рабочей станции сети Microsoft
Network (локальный), или же он переназначен серверу
(удаленный). ВХ должен содержать хендл. DX возвращает поле
битов УВВ - если бит 15 установлен, то хендл относится к
удаленному файлу или устройству.
Прикладным программам не следует тестировать бит 15, т.к.
им не надо различать локальные и удаленные устройства.
Программы должны быть написаны так, чтобы обеспечивалась
независимость от положения устройств.
В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:
Код Значение
__________________________________________________________
1 Для этого системного вызова должна быть загружена
сеть MN
6 Хендл в ВХ не является разрешенным, открытым
хендлом
__________________________________________________________
- 109 -
Макроопределение:
ioctl-rhandle macro handle
mov bl,handle
mov al,0AH
mov ah,44H
int 21H
endm
Пример:
Следующая программа проверяет, является ли хендл 5
локальным или удаленным, и выводит соответствующее сообщение.
stdout equ 1
;
message db "Хендл 5 - "
loc db "локальный."
rem db "удаленный."
crlf db 0DH,0AH
;
begin: write-handle stdout,message,12 ; На экран message
jc write-error ; Метка не показана
ioctl-rhandle 5 ; Наша функция
jc ioctl-error ; Метка не показана
test dx,8000H ; Бит 15 установлен?
jnz not-loc ; Да, это удаленный
write-handle stdout,loc,10 ; См. функцию 40Н
jc write-error ; Метка не показана
jmp done ; Конец
not-loc: write-handle stdout,rem,10 ; См. функцию 40Н
jc write-error ; Метка не показана
done: write-handle stdout,crlf,2 ; См. функцию 40Н
jc write-error ; Метка не показана
УВВ ПОВТОРЕНИЕ ( ФУНКЦИЯ 44Н, КОД 0ВН )
Вызов: АН = 44Н
AL = 0BH
DX - количество повторов
СХ - время ожидания
Возвращает: CF установлен:
АХ = 1 - несуществующий код
функции
CF сброшен:
нет ошибок
Комментарий:
Функция 44Н (код 0ВН) определяет количество раз, которое
система повторяет операцию с диском при сбое, из-за нарушения
соглашений системы разделения файлов. DX содержит это
количество. СХ определяет длину пауз между попытками.
MS-DOS повторяет дисковую операцию три раза, если,
конечно, вы не укажите с помощью этой функции другое число. По
завершении попыток система вызывает прерывание 24Н (Прерывание
- 110 -
по критической ошибке) программы, запрашивающей дисковую
операцию.
Длина пауз, загружаемая в СХ, зависит от конкретной ЭВМ,
так как это число определяет, какое число раз MS-DOS должна
выполнить пустой цикл. Время выполнения цикла зависит от
процессора и его тактовой частоты. Вы можете определить
зависимость пауз от СХ на своей машине с помощью DEBUG.
Установите количество попыток равное 1 , а затем про-
хронометрируйте различные значения СХ.
В случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:
Код Значение
__________________________________________________________
1 Для этого системного вызова должна быть загружена
процедура разделения файла
Макроопределение:
ioctl-retry macro retries,wait
mov dx,retries
mov cx,wait
mov al,0BH
mov ah,44H
int 21H
endm
Пример:
Следующая программа устанавливает количество попыток
разделения равное 10, а время пауз - 1000.
begin: ioctl-retry 10,1000 ; Наша функция
jc error ; Метка не показана
ОБЩЕЕ УВВ (ДЛЯ ХЕНДЛОВ) ( ФУНКЦИЯ 44Н, КОД 0СН )
Вызов: АН = 44Н
AL = 0CH
BX - хендл
СН - код категории устройства
CL - код подфункции
DS:DX - указатель на буфер данных
Возвращает: CF установлен:
АХ - 1 = неправильный код функции
- = любая ошибка устройства
CF сброшен:
Нет ошибок
Комментарий:
Эта функция выбирает и загружает кодовую страницу для
устройства. Кроме того, она устанавливает или возвращает
счетчик повторений вывода для принтеров, поддерживающих режим
"ВЫВОД ПОКА НЕ ЗАНЯТО".
Видеофункции (type=display) поддерживаются, только если
был загружен ansy.sys. Если этот файл не был загружен, то
команда MODE устанавливает режим видео напрямую.
- 111 -
Функция использует базовую систему ввода/вывода для
установки и возвращения состояния об'екта.
Команда MODE устанавливает значения через этот интерфейс,
а утилиты DOS имеют доступ к информации через этот интерфейс.
Код категории может иметь следующие значения:
Код Значение
__________________________________________________________
00 Неизвестное устройство
01 Последовательный принтер
03 Консоль (дисплей)
05 Параллельный принтер
__________________________________________________________
Код подфункции может иметь следующие значения:
Код Значение
__________________________________________________________
45Н Устанавливает число повторений для принтера
4АН Выбирает кодовую страницу
4СН
4DH
5FH Устанавливает устройство дисплей
65Н Возвращает число повторения для принтера
6АН Возвращает выбранную кодовую страницу
6ВН
7АН Возвращает символ дисплея (длина, ширина и цвет
экрана)
__________________________________________________________
Примечание
DS:DX адресуют слово, содержащее новую величину
для общего количества повторений вывода перед
продолжением работы, то есть количество раз,
которое драйвер будет ждать от устройства сигнал
"готов" перед подтверждением "устройство
занято".
__________________________________________________________
Макроопределение:
ioctl-handles macro handle,function,category,buffer
mov ch,05H
mov cl,function
mov dx,offset buffer
mov bx,handle
mov ah,44H
mov al,0CH
int 21H
endm
Пример:
Следующая программа возвращает характеристики устройства.
mov ax,440CH ; Код функции
mov bx,handle ; Хендл открытого устройства
mov ch,03H ; Дисплей
mov cl,7FH ; Получить
lds dx,buffer ; Адрес буфера
int 21H
jc error
- 112 -
buffer label byte ; Буфер для возврата
db 0 ; Перед вызовом устанав-
; ливается в ноль
db 0 ; Зарезервирован для
; типа дисплей
dw 7*2 ; Длина данных
dw flags ; Управляющие флаги
; 0001Н=яркий
; Режим дисплея
; 1=текстовый
; 2=АРА
db 0 ; Зарезервирован
dw colors ; Количество цветов
; (монохромный=0)
dw width ; Ширина в пикселях
dw length ; Длина в пикселях
dw cols ; Количество колонок
dw rows ; Количество строк
Для возврата информации по кодовой странице и вектора
DBCS (Набор двубайтных символов) добавьте следующее:
mov ax,440CH ; Код функции
mov cx,036AH ; Дисплей
mov bx,handle
lds dx,buffer ; Сменить содержимое буфера
int 21H
jc error
buffer label word
dw end-start ; Длина
start:
dw codepage ; Кодовая страница
db s1,e1 ; Вектор DBCS
db 0,0 ; Конец списка
__________________________________________________________
Примечание
Некоторые драйверы возвращают только кодовую
страницу, поэтому пользователь этой функции
должен проверить поле длины, для уверенности, что
информация по DBCS присутствует. Драйверам
display.sys и printer.sys нет необходимости
поддерживать DBCS-информацию. Такая поддержка
включена только азиатский вариант MS-DOS 4.0.
__________________________________________________________
- 113 -
ОБЩЕЕ УВВ (ДЛЯ УСТРОЙСТВ) ( ФУНКЦИЯ 44Н, КОД 0DH )
Вызов: АН = 44Н
AL = 0DH
BL - номер дисковода (0=текущий, 1=А)
СН - код категории
CL - код подфункции
DS:DX - Указатель на блок параметров
Возвращает: CF установлен:
АХ - 1 = неправильный код функции
2 = несуществующий дисковод
- = любая ошибка устройства
CF сброшен:
Нет ошибок
Комментарий:
Код подфункции может принимать следующие значения:
Код Значение
__________________________________________________________
40 Установить параметры устройства
41 Записать дорожку на логическое устройство
42 Форматировать дорожку на логическом устройстве
60 Получить параметры устройства
61 Читать дорожку с логического устройства
62 Проверить дорожку на логическом устройстве
__________________________________________________________
Примечание
Перед вызовом всех этих функций вы должны
установить параметры функцией CL=40.
__________________________________________________________
Вы должны придерживаться следующей процедуры при чтении,
записи, форматировании или проверке:
1. Сохранить параметры используя "Получить параметры
устройства".
2. Установить нужные параметры соответствующей функцией.
3. Выполнить операцию ввода/вывода.
4. Восстановить предыдущие параметры.
Установить параметры устройства (CL=40H)
----------------------------------------
При этой подфункции блок параметров имеет следующий формат:
________________________________
і BYTE - специальные функции і
і BYTE - тип устройства і
і WORD - атрибуты устройства і
і WORD - количество цилиндров і
і BYTE - байт описатель диска і
і_______________________________і
і БПБ устройства і
і_______________________________і
і Разметка дорожек і
і_______________________________і
- 114 -
Эти поля имеют следующие значения:
а) специальные функции
Бит = Значение
__________________________________________________________
0 0 Поле БПБ содержит новый БПБ (по ум.) для этого
устройства. Если предыдущая подфункция 40Н уста-
новила этот бит в 1, то операция Построить БПБ
возвращает действительный БПБ диска. В противном
случае возвращается БПБ по умолчанию.
1 Все последующие запросы на операцию Построить БПБ
возвращают БПБ устройства.
1 0 Читать все поля в блоке параметров.
1 Игнорировать все поля блока параметров, за исклю-
чением поля Разметка дорожки.
2 0 Сектора на дорожке возможно неодинакового размера
( Вы не должны использовать это значение)
1 Все сектора на дорожке одинакового размера, с
номерами от 1 до общего кол-ва секоров на дорож-
ке. ( Вы всегда должны устанавливать этот бит ).
3-7 0 Эти биты должны быть нулями.
__________________________________________________________
б) тип устройства
Этот байт описывает физическое устройство и
устанавливается устройством. При установке он имеет следующее
значение:
0 - 320/360 килобайт
1 - 1,2 мегабайт
2 - 720 килобайт
3 - 8-дюймовый нормальной плотности
4 - 8-дюймовый двойной плотности
5 - Жесткий диск
6 - Кассетный накопитель
7 - 1.44 мегабайта
в) атрибуты устройства
Бит = Значение
__________________________________________________________
0 0 Диск сменяемый
1 Диск несменяемый
1 0 Состояние замка не анализируется
1 Состояние замка анализируется
2-7 0 Эти биты должны быть нулями
__________________________________________________________
г) количество цилиндров
Это поле указывает максимальное количество цилиндров на
физическом устройстве. Это поле устанавливается устройством.
д) описатель диска
Этот байт указывает тип диска для данного дисковода.
По умолчанию тип диска - диск высокой плотости, 1,2МГб.
- 115 -
Для этого типа бит 0 имеет следующие значения:
Бит = Значение
__________________________________________________________
0 0 Диск высокой плотности, 1,2 МГб.
1 Диск двойной плотности, 320/360Кб.
__________________________________________________________
е) БПБ устройства (Блок параметров БСВВ)
Если бит 0 поля "Спец. функции " сброшен, то в поле "БПБ
устройства" находится новый текущий БПБ для устройства.
Если этот бит установлен, то драйвер устройства
возвращает БПБ для всех последующих запросов Построить БПБ.
ж) разметка дорожки
Это поле содержит таблицу переменной длины для каждого
логического устройства и указывает разметку дорожки по секторам:
WORD - Число секторов
WORD - Номер сектора (сектор номер 1)
WORD - Размер сектора (сектор номер 1)
WORD - Номер сектора (сектор номер 2)
WORD - Размер сектора (сектор номер 2)
.
.
.
WORD - Номер сектора (сектор номер n)
WORD - Размер сектора (сектор номер n)
Первое слово содержит общее количество секторов. Каждый
номер должен быть уникальным и варьироваться в пределах от 1
до значения поля 'Число секторов'.
Если бит 2 в поле 'Специальные функции' установлен, то
размеры всех секторов должны быть одинаковы.
Получить параметры устройства (CL=60H)
--------------------------------------
Если CL=60H, то блок параметров имеет тот же формат, что
и при CL=40H. Однако значения некоторых полей различаются:
а) операция
Бит = Значение
__________________________________________________________
0 0 Возвращает текущий БПБ для устройства.
1 Возвращает БПБ, который бы вернула операция
Построить БПБ.
1-7 0 Эти биты должны быть нулями.
__________________________________________________________
ж) разметка дорожки
При получении параметров устройства функция не использует
это поле.
- 116 -
Читать/записать дорожку на логическом устройстве
(CL=61H/41H)
-------------------------------------------------
Если CL равен 41Н или 61Н, то блок параметров имеет
следующий формат:
BYTE - Специальные функции
WORD - Головка
WORD - Цилиндр
WORD - Первый сектор
WORD - Количество секторов
DWORD - Указатель на буфер обмена с диском
Перечисленные поля имеют следующие значения:
а) специальные функции
Этот байт должен быть нулем
б) поле содержит количество головок, на которых вы
выполняете запись или чтение.
в) цилиндр
это поле содержит количество цилиндров, на которых вы
выполняете запись или чтение.
г) первый сектор
это поле содержит номер первого сектора, на котором вы
выполняете запись или чтение. Сектора пронумерованы, начиная с
0, поэтому четвертый сектор, например, будет иметь третий номер.
д) количество секторов
это поле содержит общее количество секторов.
е) адрес буфера обмена с диском
это поле содержит адрес буфера обмена с диском, куда
помещается записываемая и считываемая информация.
Форматировать/проверить дорожки на логическом дисководе
(CL=42H/62H)
-------------------------------------------------------
Для форматирования и проверки дорожки на логическом
дисководе CL должен быть равен 42Н, а для проверки дорожки -
62Н.
В этих случаях блок параметров будет иметь следующий
формат:
BYTE - специальные функции
WORD - головка
WORD - цилиндр
- 117 -
Перечисленные поля имеют следующие значения:
а) специальные функции
Этот байт должен быть 0
б) головка
Это поле содержит количество головок, на которых вы
выполняете форматирование и проверку.
в) цилиндр
Это поле содержит количество цилиндров, на которых вы
выполняете форматирование и проверку.
ПОЛУЧИТЬ/УСТАНОВИТЬ КАРТУ ЛОГИЧЕСКОГО ДИСКОВОДА
( ФУНКЦИЯ 44Н, КОДЫ 0EH и 0FH )
Вызов: АН = 44Н
AL - 0EH = получть карту логического
дисковода
0FH = установить карту логического
дисковода
BX - номер дисковода
( 0=текущий, 1=А и т.д.)
Возвращает: CF установлен:
АХ - 1 = несуществующий код
функции
5 = несуществующий дисковод
CF сброшен:
AL - логический дисковод,
назначенный физическому
- 0 = только один логический
дисковод назначен физи-
ческому.
Комментарий:
MS-DOS обеспечивает назначение множества логических
дисководов одному физическому. Подфункция Получить карту
логического дисковода позволяет узнать, какой логический
дисковод в данный момент назначен указанному физическому.
Подфункция Установить карту логического дисковода позволяет
сменить логический дисковод, назначаемый в данный момент
указанному физическому. Эти функции полезны, если больше
одного логического устройства назначено одному физическому
устройству.
Результат операции можно получить, проверив содержимое AL.
Возможное применение этих функций - прикладные программы,
которым необходимо отменить запрос DOS, чтобы обеспечить смену
соответствующих флоппи-дисков в дисководе при доступе к другим
логическим дисководам.
©
KOAP Open Portal 2000
|
|