ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
КАК СОЗДАТЬ ВРЕМЕННЫЙ ФАЙЛ ( ФУНКЦИЯ 5АН )СХ - атрибут DS:DX - указатель на маршрут (см. текст) Возвращает: CF (флаг переноса) установлен: АХ - 2 = файл не найден 3 = маршрут не найден 4 = слишком много открытых файлов 5 = нет доступа CF сброшен: АХ - хендл Комментарий: Функция 5АН создает файл с уникальным именем. DX должен содержать смещение (сегментный адрес в DS) строки ASCIZ, указывающей маршрут и заканчивающейся, помимо байта 0, тринадцатью байтами памяти ( для имени файла). СХ должен содержать присваиваемый файлу атрибут (см. Раздел 1.5.5, "Атрибуты файла"). MS-DOS создает уникальное имя файла и присоединяет его к маршруту, указываемому DS:DX, затем создает этот файл, открывает в режиме совместимости и возвращает хендл файла в АХ. Эту функцию могут использовать программы, которым нужен временный файл с уникальным именем для предотвращения возможных конфликтов с существующими именами файлов. MS-DOS не уничтожает созданный файл автоматически. Если вы больше не нуждаетесь в этом файле, то удалить его должны вы сами. - 142 - В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 2 Файл не найден 3 Маршрут не найден 4 Слишком много открытых файлов (нет больше хендлов) 5 Нет доступа __________________________________________________________ Макроопределение: create-temp macro pathname,attrib mov cx,attrib mov dx,offset pathname mov ah,5AH int 21H endm Пример: Следующая программа создает временный файл в каталоге \wp\docs, копирует из текущего каталога файл textfile.asc во временный файл, после чего закрывает оба файла. stdout equ 1 ; file db "TEXTFILE.ASC",0 path db "\WP\DOCS",0 temp db 13 dup (0) open-msg db " открыт.",0DH,0AH crl-msg db " создан.",0DH,0AH rd-msg db " прочитан в буфер.",0DH,0AH wr-msg db "Буфер записан в " cl-msg db "Файлы закрыты.",0DH,0AH crlf db 0DH,0AH handle1 dw ? handle2 dw ? buffer db 512 dup (?) ; begin: open-handle file,0 ; См. функцию 3DH jc open-error ; Метка не показана mov handle1,ax ; Сохранить хендл write-handle stdout,file,12 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,open-msg,10 ; См. функцию 40Н jc write-error ; Метка не показана create-temp path,0 ; Наша функция jc create-error ; Метка не показана mov handle2,ax ; Сохранить хендл write-handle stdout,path,8 ; См. функцию 40Н jc write-error ; Метка не показанa display-char " write-handle stdout,temp,12 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,crl-msg,11 ; См. функцию 40Н jc write-error ; Метка не показана read-handle handle1,buffer,512 ; См. функцию 3FH jc read-error ; Метка не показана - 143 - write-handle stdout,file,12 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,rd-msg,20 ; См. функцию 40Н jc write-error ; Метка не показана write-handle handle2,buffer,512 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,wr-msg,18 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,temp,12 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,crlf,12 ; См. функцию 40Н jc write-error ; Метка не показана close-handle handle1 ; См. функцию 3ЕН jc close-error ; Метка не показана close-handle handle2 ; См. функцию 3ЕН jc close-error ; Метка не показана write-handle stdout,cl-msg,16 ; См. функцию 40Н jc write-error ; Метка не показана СОЗДАТЬ НОВЫЙ ФАЙЛ ( ФУНКЦИЯ 5ВН ) Вызов: АН = 5ВН СХ - атрибут DS:DX - указатель на маршрут Возвращает: CF установлен: АХ - 2 = файл не найден 3 = маршрут не найден 4 = Слишком много открытых файлов 5 = нет доступа 80 = файл уже существует CF сброшен: АХ - хендл Комментарий: Функция 5ВН создает новый файл. DX должен содержать смещение (сегментный адрес в DS) строки ASCIZ, указывающей маршрут. СХ содержит присваиваемый файлу атрибут (см. Раздел 1.5.5, "Атрибуты файла"). Если не существует файла с таким же именем, то MS-DOS создает файл, открывает его в режиме совместимости и возвращает его хендл в АХ. В отличии от функции 3СН, которая при наличии файла с таким же именем сбрасывает длину этого файла в ноль, функция 5ВН возвращает код ошибки. В мультипрограммных системах факт существования файла используется в качестве семафора. Вы можете использовать эту функцию для проверки и установки семафора. В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: - 144 - Код Значение __________________________________________________________ 2 Файл не найден 3 Маршрут не найден 4 Слишком много открытых файлов (нет больше хендлов) 5 Нет доступа 80 Файл с такой спецификацией уже существует __________________________________________________________ Макроопределение: create-new macro pathname,attrib mov cx,attrib mov dx,offset pathname mov ah,5BH int 21H endm Пример: Следующая программа пытается создать новый файл report.asm в текущем каталоге. Если такой файл уже существует, то программа выводит сообщение об ошибке и возвращает управление системе. Если такой файл не существует и нет других ошибок, то программа сохраняет полученный хендл и выполняет дальнейшие действия. err-msg db "ФАЙЛ УЖЕ СУЩЕСТВУЕТ",0DH,0AH,"$" path db "report.asm",0 handle dw ? ; begin: create-new path,0 ; Наша функция jnc continue ; Дальнейшие действия cmp ax,80 ; Файл уже существует? jne error ; Метка не показана display err-msg ; См. функцию 09Н jmp return ; Возврат в MS-DOS continue: mov handle,ax ; Сохранить хендл ; ; ( дальнейшие действия ) БЛОКИРОВАТЬ ( ФУНКЦИЯ 5СН, КОД 00Н ) Вызов: АН = 5СН AL = 00H ВХ - хендл CX:DX - смещение блокируемой области SI:DI - длина блокируемой области - 145 - Возвращает: CF установлен: АХ - 1 = несуществующий код функции 6 = несуществующий хендл 33 = уже блокирована 36 = буфер переполнен CF сброшен: нет ошибок Комментарий: Функция 5СН (код 00Н) запрещает доступ (по чтению или по записи) любой программе в указанную область файла. ВХ должен содержать хендл файла, содержащего блокируемую область. CX:DX (четырех-байтное целое) должны содержать смещение блокируемой области от начала файла. SI:DI (четырех-байтное целое) должны содержать длину блокируемой области. Если другая программа попытается получить доступ (по чтению или записи) к блокированной области, то MS-DOS делает три попытки, после чего (если они не удались) вызывает прерывание 24Н для этой программы. Количество попыток вы можете изменить с помощью функции 44Н (код 0ВН) (УВВ Повторить). Блокируемая область может быть в любом месте файла, например, в его конце. Блокировку нужно устанавливать лишь на короткие промежутки времени. Так, если область файла заблокирована более десяти секунд, то вы можете уже считать это ошибкой. Функции 45Н (Дубликат хендла) и 46Н (Активизировать дубликат) наследуют и доступ к любой блокированной области. Дочерняя программа, загруженная с помощью функции 4ВН(код 00Н) (Загрузить и выполнить программу) и получившая в наследство файл, не наследует доступ к блокированным областям. __________________________________________________________ Предостережение Если программа закрывает файл, содержащий блокированную область или прерывается с открытым файлом, содержащим такую область, то результат не определен. __________________________________________________________ Программы, которые могут быть прерваны с помощью прерываний 23Н (Прерывание по CONTROL+C) и 24Н (Прерывание по критической ошибке) должны поймать этот момент и разблокировать перед выходом все блокированные области. Программа может определить статус области (блокирована - разблокирована) попыткой блокировать ее и последующей обработкой возвращаемого кода. В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Должна быть загружена система разделения файлов 6 Содержимое ВХ не является разрешенным, открытым хендлом 33 Вся или часть указанная(ой) область(и) уже блоки- рована 36 Нет больше места для данных в буфере. См. команду SHARE в СПРАВОЧНИКЕ ПОЛЬЗОВАТЕЛЯ MS-DOS, где дается описание порядка выделения мест в буфере. __________________________________________________________ - 146 - Макроопределение: lock macro handle,start,bytes mov bx,handle mov cx,word ptr start mov dx,word ptr start+2 mov si,word ptr bytes mov di,word ptr bytes+2 mov al,0 mov ah,5CH int 21H endm Пример: Следующая программа открывает файл finalrpt в режиме доступа "Разрешение чтения/записи" и блокирует две его области: первые 128 байт и байты от 1024 до 5119. После некоторой (не уточняется) обработки, программа разблокирует те-же области и закрывает файл. stdout equ 1 ; start1 dd 0 lgth1 dd 128 start2 dd 1023 lgth2 dd 4096 file db "FINALRPT",0 op-msg db " открыт.",0DH,0AH l1-msg db "Блокированы первые 128 байт.",0DH,0AH l2-msg db "Блокированы байты 1024-5119.",0DH,0AH u1-msg db "Разблокированы первые 128 байт.",0DH,0AH u2-msg db "Разблокированы байты 1024-5119.",0DH,0AH cl-msg db " закрыт.",0DH,0AH handle dw ? ; begin: open-handle file,01000010b ; См. функцию 3DH jc open-error ; Метка не показана write-handle stdout, file,8 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,op-msg,10 ; См. функцию 40Н jc write-error ; Метка не показана mov handle,ax ; Сохранить хендл lock handle,start1,lgth1 ; Наша функция jc lock-error ; Метка не показана write-handle stdout,l1-msg,30 ; См. функцию 40Н jc write-error ; Метка не показана lock handle,start2,lgth2 ; Наша функция jc lock-error ; Метка не показана write-handle stdout,l2-msg,30 ; См. функцию 40Н jc write-error ; Метка не показана ; ; ( дальнейшая обработка ) ; unlock handle,start1,lgth1 ; См. функцию 5С01Н jc unlock-error ; Метка не показана write-handle stdout,u1-msg,33 ; См. функцию 40Н jc write-error ; Метка не показана unlock handle,start2,lgth2 ; См. функцию 5С01Н jc unlock-error ; Метка не показана - 147 - write-handle stdout,u2-msg,33 ; См. функцию 40Н jc write-error ; Метка не показана close-handle handle ; См. функцию 3ЕН jc close-error ; Метка не показана write-handle stdout,file,8 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,cl-msg,10 ; См. функцию 40Н jc write-error ; Метка не показана РАЗБЛОКИРОВАТЬ ( ФУНКЦИЯ 5СН, КОД 01Н ) Вызов: АН = 5СН AL = 01H ВХ - хендл CX:DX - смещение разблокируемой области SI:DI - длина разблокируемой области Возвращает: CF установлен: АХ - 1 = несуществующий код функции 6 = несуществующий хендл 33 = разные области 36 = буфер переполнен CF сброшен: нет ошибок Комментарий: Функция 5СН (код 01Н) разблокирует область, заблокированную до этого той же программой. В ВХ необ- ходимо загрузить хендл файла, содержащего эту область. Регистры CX:DX и SI:DI загружаются так же, как и в функции 5СН (код 00Н). То есть, размер и смещение разблокируемой области должны в точности совпадать с соответствующими величинами, указанными при вызове функции 5СН с кодом 00Н (Блокировать). Техника работы с этими функциями дана в описании функции 5СН (код 00Н). В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Должна быть загружена система разделения файлов 6 Содержимое ВХ не является разрешенным, открытым хендлом 33 Указанная область не идентична области, заблокированной ранее той же программой 36 Нет больше места для данных в буфере. См. команду SHARE в СПРАВОЧНИКЕ ПОЛЬЗОВАТЕЛЯ MS-DOS, где дается описание порядка выделения мест в буфере. __________________________________________________________ Вы можете вызвать функцию 59Н (Получить расширенный код ошибки) для получения кода возможной ошибки, возвращаемого этой функцией. - 148 - Макроопределение: unlock macro handle,start,bytes mov bx,handle mov cx,word ptr start mov dx,word ptr start+2 mov si,word ptr bytes mov di,word ptr bytes+2 mov al,1 mov ah,5CH int 21H endm Пример: Следующая программа открывает файл finalrpt в режиме доступа "Разрешение чтения/записи" и блокирует две его области: первые 128 байт и байты от 1024 до 5119. После некоторой (не уточняется) обработки, программа разблокирует те же области и закрывает файл. stdout equ 1 ; start1 dd 0 lgth1 dd 128 start2 dd 1023 lgth2 dd 4096 file db "FINALRPT",0 op-msg db " открыт.",0DH,0AH l1-msg db "Блокированы первые 128 байт.",0DH,0AH l2-msg db "Блокированы байты 1024-5119.",0DH,0AH u1-msg db "Разблокированы первые 128 байт.",0DH,0AH u2-msg db "Разблокированы байты 1024-5119.",0DH,0AH cl-msg db " закрыт.",0DH,0AH handle dw ? ; begin: open-handle file,01000010b ; См. функцию 3DH jc open-error ; Метка не показана write-handle stdout, file,8 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,op-msg,10 ; См. функцию 40Н jc write-error ; Метка не показана mov handle,ax ; Сохранить хендл lock handle,start1,lgth1 ; См. функцию 5С00Н jc lock-error ; Метка не показана write-handle stdout,l1-msg,30 ; См. функцию 40Н jc write-error ; Метка не показана lock handle,start2,lgth2 ; См. функцию 5С00Н jc lock-error ; Метка не показана write-handle stdout,l2-msg,30 ; См. функцию 40Н jc write-error ; Метка не показана ; ; ( дальнейшая обработка ) ; unlock handle,start1,lgth1 ; Наша функция jc unlock-error ; Метка не показана write-handle stdout,u1-msg,33 ; См. функцию 40Н jc write-error ; Метка не показана unlock handle,start2,lgth2 ; Наша функция jc unlock-error ; Метка не показана - 149 - write-handle stdout,u2-msg,33 ; См. функцию 40Н jc write-error ; Метка не показана close-handle handle ; См. функцию 3ЕН jc close-error ; Метка не показана write-handle stdout,file,8 ; См. функцию 40Н jc write-error ; Метка не показана write-handle stdout,cl-msg,10 ; См. функцию 40Н jc write-error ; Метка не показана ПОЛУЧИТЬ ИМЯ СТАНЦИИ ( ФУНКЦИЯ 5ЕН, КОД 00Н ) Вызов: АН = 5ЕН AL = 0 DS:DX - указатель на 16-байтный буфер Возвращает: CF установлен: АХ = 1 - несуществующий код функции CF сброшен: СХ - идентификационный номер локального компьютера СН - законность имени станции: 00Н = не разрешено Не ноль = разрешено СL - номер, назначаемый машине Сетевой БСВВ (Базовая система ввода/вывода) DS:DX - сегмент:смещение строки ASCIZ с именем станции Комментарий: Функция 5ЕН (код 00Н) возвращает сетевое имя локального компьютера. DS:DX должны указывать на 16-байтный буфер. Должна быть запущена сеть Microsoft Networks. MS-DOS возвращает имя компьютера (в виде 16-байтной строки ASCIZ, дополненной пробелами) в буфер, адресуемый регистрами DS:DX. Если сеть не была установлена, то СН возвращает нули, а значение CL теряет смысл. В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Для вызова этой функции должна быть запущена сеть Microsoft Networks (MN) __________________________________________________________ Макроопределение: get-machine-name macro buffer mov dx,offset buffer mov al,0 mov ah,5EH int 21H endm - 150 - Пример: Следующая программа выводит на экран имя станции в сети MN. stdout equ 1 ; msg db "Сетевое имя: " mac-name db 16 dup (?),0DH,0AH ; begin: get-machine-name mac-name ; Наша функция jc name-error ; Метка не показана write-handle stdout,msg,31 ; См. функцию 40Н jc write-error ; Метка не показана УСТАНОВКА ПРИНТЕРА ( ФУНКЦИЯ 5ЕН, КОДЫ 02Н и 03Н ) Вызов: АН = 5ЕН AL - 02H = установить управляющую строку для принтера 03Н = получить управляющую строку принтера ВХ - индекс с листа назначения СХ (если AL=02H) - длина управляющей строки DS:SI - указатель на управляющую строку ES:DI (если AL=03H) - сегмент:смещение 64-байтного буфера для получения управ- ляющей строки. Возвращает: CF установлен: АХ = 1 - несуществующий код функции CF сброшен: СХ (если AL=03H) - длина управляющей строки принтера в байтах ES:DI (если AL=03H) - сегмент:смещение управляющей стро- ки (ASCII) прин- тера. Комментарий: Функция 5ЕН (код 02Н) определяет строку управляющих символов, которую MS-DOS добавляет в начало каждого файла, посылаемого на сетевой принтер. ВХ должен содержать индекс листа назначения, указывающий принтер ( первый вход имеет индекс 0). СХ должен содержать длину строки, а DS:SI - сегмент и смещение самой строки. Должна быть запущена сеть Microsoft Networks (MN). Эта функция позволяет каждой программе, разделяющей принтер, иметь свою собственную конфигурацию принтера. Вы можете использовать функцию 5F02H (Получить вход с листа назначения) для определения, какой вход из листа назначения относится к принтеру. Следующая программа определяет управляющую строку принтера, состоящую из одного символа, для печати расширенным типом на Epson-совместимых принтерах. Принтер отменяет этот - 151 - режим после первого символа ВК. Таким образом, первая строка каждого посылаемого на сетевой принтер файла будет распечатана как заголовок. В примере индекс принтера принимается равным 3 (четвертый вход в листе назначения). Для определения этой величины можно воспользоваться функцией 5F02H (Получить вход с листа назначения). В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Для вызова этой функции должна быть запущена сеть Microsoft Networks (MN) __________________________________________________________ Макроопределение: printer-setup macro index,lgth,string mov bx,index mov cx,lgth mov dx,offset string mov al,2 mov ah,5EH int 21H endm Пример: setup db 0EH ; begin: printer-setup 3,1,setup ; Наша функция jc error ; Метка не показана ПОЛУЧИТЬ ВХОД С ЛИСТА НАЗНАЧЕНИЯ ( ФУНКЦИЯ 5FH, КОД 02Н ) Вызов: АН = 5FH AL = 02H ВХ - индекс листа назначения DS:SI - указатель на буфер для локального имени ES:DI - указатель на буфер для удаленного имени Возвращает: CF установлен: АХ - 1 = несуществующий код функции 18 = превышен индекс CF сброшен: BL - 3 = принтер 4 = дисковод СХ - хранимое значение, устанавливаемое пользова- телем - 152 - Комментарий: Функция 5FH (код 02Н) возвращает указанный вход с листа назначений. ВХ должен содержать индекс листа назначений (индекс 0 это первый вход), а DS:SI сегмент и смещение 16-байтного буфера для локального имени. ES:DI должны содержать сегмент и смещение 128-байтного буфера для удаленного имени. Должна быть запущена сеть Microsoft Networks. MS-DOS помещает локальное имя в буфер, адресуемый DS:SI, a удаленное имя в буфер, адресуемый ES:DI. Локальное имя может быть нулевой ASCIZ строкой. BL возвращает 3, если локальное устройство принтер и 4, если им является дисковод. СХ возвращает хранимое значение, устанавливаемое пользователем при вызове функции 5F03H (Соединить в сети). Содержимое листа назначения может менятся между вызовами. С помощью этой функции вы можете получить любой вход или сделать полную копию листа назначения, последовательно увеличивая индекс. Для определения конца листа нужно проверять наличие кода ошибки 18 (превышен индекс), как это вы делаете при просмотре каталога с помощью функций 4ЕН (Найти первый файл) и 4FH (Найти следующий файл), проверяя код 18 (Нет больше файлов). В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Для вызова этой функции должна быть запущена сеть Microsoft Networks (MN) 18 Индекс, загруженный в ВХ, превышает количество входов в листе назначения __________________________________________________________ Макроопределение: get-list macro index,local,remote mov bx,index mov si,offset local mov di,offset remote mov al,2 mov ah,5FH int 21H endm Пример: Следующая программа выводит на экран лист назначения для рабочей станции сети MN, показывая локальное имя, удаленное имя и тип устройства для каждого входа. stdout equ 1 printer equ 3 ; local-nm db 16 dup (?),2 dup (20H) remote-nm db 128 dup (?),2 dup (20H) header db "Local name",8 dup (20H) ; Локальное имя db "Remote name",7 dup (20H) ; Удаленное имя db "Device type" ; Тип устройства crlf db 0dh,0ah,0dh,0ah drive-msg db "drive" ; Дисковод - 153 - print-msg db "printer" ; Принтер index dw ? ; begin: write-handle stdout,header,51 ; См. функцию 40Н jc write-error ; Метка не показана mov index,0 ; Сброс индекса ck-list: get-list index,local-nm,remote-nm ; Наша функция jnc got-one ; Получен вход error: cmp ax,18 ; Конец ? je last-one ; Да jmp error ; Метка не показана got-one: push bx ; Сохранить тип ; устройства write-handle stdout,local-nm,148 ; См. функцию 40Н jc write-error ; Метка не показана pop bx ; Получить тип ; устройства cmp bl,printer ; Это принтер? je prntr ; Да write-handle stdout,drive-msg,5 ; См. функцию 40Н jc write-error ; Метка не показана jmp get-next ; Дать сообщение prntr: write-handle stdout,print-msg,7 ; См. функцию 40Н jc write-error ; Метка не показана get-next: write-handle stdout,crlf,2 ; См. функцию 40Н jc write-error ; Метка не показана inc index ; Инкремент индекса jmp ck-list ; Получить следующий ; вход last-one: write-handle stdout,crlf,4 ; См. функцию 40Н jc write-error ; Метка не показана СОЕДИНИТЬ В СЕТИ ( ФУНКЦИЯ 5FH, КОД 03Н ) Вызов: АН = 5FH AL = 03H BL - 3 = принтер 4 = дисковод СХ - величина пользователя DS:SI - указатель на имя устройства- источника ES:DI - указатель на имя устройства- адресата Возвращает: CF установлен: АХ - 1 = несуществующий код функции 3 = маршрут не найден 5 = нет доступа 8 = мало памяти (Могут быть другие ошибки, конкретно в сети) CF сброшен: нет ошибок - 154 - Комментарий: Функция 5FH (код 03Н) адресует принтер или дисковод (устройство источник) сетевому каталогу (устройство адресат). BL должен содержать 3, если источник - принтер и 4, если им является дисковод. DS:SI должны содержать сегмент и смещение строки ASCIZ, указывающей имя принтера или дисковода с последующим двоеточием, или нулевой строки (один байт 00Н). ES:DI должны содержать сегмент и смещение строки ASCIZ, указывающей имя сетевого каталога. СХ содержит 16-битную величину, устанавливаемую пользователем и сохраняемую системой. Должна быть запущена сеть Microsoft Networks (MN). Формат строки адресата (строка ASCIZ): имя-машины маршрут 00Н пароль 00Н , где: Имя-машины - имя сервера, содержащего сетевой каталог. Маршрут - имя сетевого каталога (не каталоговый маршрут), которому адресуется устройство-источник. 00Н - нулевой байт Пароль - пароль для доступа к сетевому каталогу. Если пароль не указан, то оба нулевых байта непосредственно следуют за маршрутом. Если BL = 3, то строка источника должна быть PRN, LPT1, LPT2 или LPT3. Эта функция буферирует и отсылает весь вывод для этого принтера на удаленный принтер, указанный в строке адресата. Если BL = 4, то строка источника может быть как именем дисковода с последующим двоеточием, так и нулевой строкой. Если строка источника содержит разрешенное имя дисковода с двоеточием, то все последующие обращения к этому имени переадресуются сетевому каталогу, указанному в строке адресата. Если строка источника является нулевой строкой, то MS-DOS пытается разрешить доступ к сетевому каталогу по паролю. Максимальная длина строки адресата - 128 байт. Значение, которое вы загрузили в СХ, можно потом вернуть с помощью функции 5F02H (Получить вход с листа назначения). В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Для вызова этой функции должна быть запущена сеть MN; значение ВХ не 1-4; неправильный формат строки источника; неправильный формат строки адресата; устройство-источник уже переадресовано. 3 Указанное имя сетевого каталога неправильно или не существует. 5 Сочетание сетевой_каталог/пароль недействительно. Это не значит, что недействителен сам пароль; - 155 - возможно каталог не существует на сервере. 8 Недостаточно памяти для строковых замен. __________________________________________________________ Макроопределение: redir macro device,value,source,destination mov bl,device mov cx,value mov si,offset source mov es,seg destination mov di,offset destination mov al,03H mov ah,5FH int 21H endm Пример: Следующая программа переадресовывает два дисковода и принтер с рабочей станции серверу (harold). Считается, что имена устройств и каталогов выглядят следующим образом: Локальный дисковод Сетевое имя Пароль или принтер на сервере E: WORD нет F: COMM FRED PRN: PRINTER QUICK printer equ 3 drive equ 4 ; local-1 db "e:",0 local-2 db "f:",0 local-3 db "prn",0 remote-1 db "\harold\word",0,0 remote-2 db "\harold\comm",0,"fred",0 remote-3 db "\harold\printer",0,"quick",0 ; begin: redir local-1,remote-1,drive,0 ; Наша функция jc error ; Метка не показана redir local-2,remote-2,drive,0 ; Наша функция jc error ; Метка не показана redir local-3,remote-3,printer,0 ; Наша функция jc error ; Метка не показана ОТМЕНИТЬ СОЕДИНЕНИЕ В СЕТИ ( ФУНКЦИЯ 5FH, КОД 04Н ) Вызов: АН = 5FH AL = 04H DS:SI - указатель на имя устройства- источника Возвращает: CF установлен: АХ - 1 = несуществующий код функции 15 = переадресация приоста- новлена на сервере (Могут быть другие ошибки, конкретно в сети) - 156 - Комментарий: Функция 5FH (код 04Н) отменяет переадресовку принтера или дисковода (источник) сетевому каталогу (адресат), выполненную с помощью функции 5F03H (Соеденить в сети). DS:SI должны содержать сегмент и смещение строки ASCIZ, указывающей имя принтера или дисковода, чья переадресация отменяется. Должна быть запущена сеть Microsoft Networks (MN). Строка ASCIZ, адресуемая DS:SI, должна содержать одно из трех значений: - Имя дисковода с последующим двоеточием. Отменяет переадресовку и восстанавливает физическое назначение дисковода. - Имя принтера (PRN, LPT1, LPT2, LPT3 или их эквивален- ты). Отменяет переадресовку и восстанавливает физическое назначение принтера. - Строка, начинающаяся с \\ ( 2 обратных слэша). Отменяет соединение между локальной машиной и сетевым каталогом. В случае ошибки, устанавливается CF, а АХ возвращает код ошибки: Код Значение __________________________________________________________ 1 Для вызова этой функции должна быть запущена сеть MN; или строка ASCIZ содержит несуществующий источник. 15 Переадресация дисковода или принтера приостанов- лена на сервере. __________________________________________________________ Макроопределение: cancel-redir macro local mov si,offset local mov al,4 mov ah,5FH int 21H endm Следующая программа отменяет переадресовку двух дисководов и принтера рабочей станции, сделанную в предыдущем примере (см. пример из функции 5F03H). local-1 db "e:",0 local-2 db "f:",0 local-3 db "prn",0 ; begin: cancel-redir local-1 ; Наша функция jc error ; Метка не показана cancel-redir local-2 ; Наша функция jc error ; Метка не показана cancel-redir local-3 ; Наша функция jc error ; Метка не показана - 157 - ПОЛУЧИТЬ ПРЕФИКС СЕГМЕНТА КОДОВ (PSP) ( ФУНКЦИЯ 62Н ) Вызов: АН = 62Н Возвращает: ВХ - сегментный адрес PSP текущей программы Комментарий: Функция возвращает сегментный адрес (в ВХ) Префикса сегмента кодов текущей программы. Макроопределение: get-psp macro mov ah,62H int 21H endm Пример: Следующая программа выводит на экран в шестнадцатеричной форме сегментный адрес своего PSP. msg db "Сегментный адрес PSP: H",0DH,0AH,"$" ; begin: get-psp ; Наша функция convert bx,16,msg[22] ; См. конец главы dispaly msg ; См. функцию 09Н ПОЛУЧИТЬ РАСШИРЕННУЮ ИНФОРМАЦИЮ ПО СТРАНЕ ( ФУНКЦИЯ 65Н ) Вызов: АН = 65Н AL - код операции (см. текст) ВХ - кодовая страница (-1 = консоль) СХ - количество возвращаемых данных DX - код страны (международный телефонный код - ID), по которой возвращается информация (-1 = текущая страна) ES:DI - адрес буфера для возвращаемой информации Возвращает: CF установлен: АХ - 1 = заполнен буфер 2 = файл не найден CF сброшен: ES:DI - указатель на буфер, содержащий информацию Комментарий: Функция 65Н возвращает стандартную информацию по стране. Эта информация включает код ID страны, кодовую страницу, формат даты и времени, символ валюты, разделитель (для тысяч, десятичный, для даты и времени), формат обозначения денежных сумм и таблицы регистрового преобразования. - 158 - Код операции в AL может быть следующим: Код Описание __________________________________________________________ 1 Вернуть стандартную информацию 2 Вернуть указатель на таблицу верхнего регистра 4 Вернуть указатель на таблицу верхнего регистра для имен файлов 6 Вернуть указатель на сравнительную таблицу 7 Выбрать двубайтовый набор символов (DBCS) __________________________________________________________ Резидентной является информация только по одной стране (по умолчанию всегда текущая). Информация по всем остальным странам хранится в файле country.sys. Команда MS-DOS NLSFUNC использует эту функцию для доступа к информации, хранящейся в файле country.sys. Если код страны и номер кодовой страницы не соответствуют друг другу, или оба они недействительны, то АХ возвращает код ошибки (2). Если СХ меньше 5, то возвращается код ошибки (1). Если количество запрошенной информации превышает значение СХ, то возвращается столько информации, сколько указано в СХ, и CF не устанавливается (нет ошибок). Если AL=1, то буфер будет заполнен следующей информацией: db 1 ; Идентификатор информации dw ? ; Размер (<=38) dw ? ; Код страны dw ? ; Кодовая страница Если AL=2, то буфер будет заполнен следующей информацией: db 2 ; Идентификатор иформации dd ? ; Указатель на таблицу верхнего регистра Если AL=4, то буфер будет заполнен следующей информацией: db 4 ; Идентификатор информации dd ? ; Указатель на таблицу верхнего регистра ; для имен файлов Обе эти таблицы состоят из поля длины (два байта) и последующих 128 в/р эквивалентов для 128 ASCII символов верхнего регистра. Используется следующая формула для вычисления адреса верхне-регистрового эквивалента в таблице: Адрес вых_симв = вх_симв - (256 - дл_табл) = нач_табл , где : Параметр Значение __________________________________________________________ вх_симв Преобразуемый символ дл_табл Длина списка в/р эквивалентов нач_табл Начальный адрес таблицы вых_симв В/Р эквивалент для вх_симв - 159 - Если вх_симв больше или равен (256 - дл_табл), то существует его в/р эквивалент в таблице; в противном случае - нет. Если AL=6, то буфер заполняется следующей информацией: db 6 ; Идентификатор информации dd ? ; Указатель на сравнительную таблицу Длина этой таблицы 258 байт. Первое слово - длина таблицы. Остальное - 256 ASCII символов в соответствующем порядке. ПОЛУЧИТЬ/УСТАНОВИТЬ ГЛОБАЛЬНУЮ КОДОВУЮ СТРАНИЦУ ( ФУНКЦИЯ 66Н ) Вызов: АН = 66Н AL - 1 = получить кодовую страницу 2 = установить кодовую страницу ВХ (если AL = 2) - устанавливаемая кодовая страница Возвращает: CF установлен: АХ - 02 = файл не найден 65 = устройство не выбрано CF сброшен: нет ошибок Комментарий: Функция 66Н устанавливает или получает кодовую страницу, используемую как внутри самой машиной, так и всеми устройствами. Если не было установлено другой страницы, то функция получает текущую кодовую страницу из DX. Если установлена другая кодовая страница, то функция получает текущую кодовую страницу из ВХ. MS-DOS получает новую кодовую страницу из файла country.sys. Перед выбором новой страницы необходимо подготовить устройства к переключению на нее. Для подготовки устройства необходимо с помощью команды DEVICE ( в файле config.sys) загрузить драйвер устройства, поддерживающий переключение кодовой страницы. Кроме того, пользователь должен использовать ключевое слово PREPARE в команде MS-DOS MODE для подготовки устройства к переключению. Выбранная кодовая страница должна быть совместима с кодом страны, указанным в файле config.sys. Если MS-DOS не может прочитать country.sys или другой файл, содержащий информацию по указанной стране, то код ошибки (2) возвращается в АХ. УСТАНОВИТЬ СЧЕТ ХЕНДЛОВ ( ФУНКЦИЯ 67Н ) Вызов: АН = 67Н ВХ - количество разрешенных хендлов Возвращает: CF установлен: - 160 - АХ - код ошибки CF сброшен: нет ошибок Комментарий: Функция 67Н увеличивает или уменьшает количество файлов, которое программа может открыть одновременно. Максимальное количество равно 64К. Если указано меньше 20, то устанавлива- ется минимальное количество - 20. При уменьшении коли- чества разрешенных хендлов новая граница вступает в силу, только если закрыты все хендлы выше этой границы. Пользователь должен использовать функцию 4АН (Установить участок) для выделения памяти расширенной таблице хендлов, если значение ВХ больше 255. Максимальный параметр команды FILES (config.sys) равен 255. СНЕСТИ В ФАЙЛ ( ФУНКЦИЯ 68Н ) Вызов: АН = 68Н ВХ - хендл файла Возвращает: CF установлен: АХ - код ошибки CF сброшен: нет ошибок Комментарий: Функция 68Н сносит все данные с буферов в файл, не закрывая его. Использование этой функции более эффективно, чем традиционное закрытие-открытие. Наиболее удачно она применяется в сетевой среде. Функция дает уверенность в адекватности дискового "образа" содержимому файла. ________________ МАКРООПРЕДЕЛЕНИЯ ________________ terminate macro int 20H endm abs-disk-read macro disk,buffer,num-sectors,ferst-sector mov al,disk mov bx,offset buffer mov cx,num-sectors mov dx,first-sector int 25H popf endm - 161 - abs-disk-write macro disk,buffer,num-sectors,first-sector mov al,disk mov bx,offset buffer mov cx, num-sectors mov dx,first-sector int 26H popf endm stay-resident macro last-instruc mov dx,offset last-instruc inc dx int 27H endm terminate-program macro xor ah,ah int 21H endm read-kbd-and-echo macro mov ah,01H int 21H endm display-char macro character mov dl,character mov ah,02H int 21H endm aux-input macro mov ah,03H int 21H endm aux-output macro character mov dl,character mov ah,04H int 21H endm print-char macro character mov dl,character mov al,05H int 21H endm dir-console-io macro switch mov dl,switch mov ah,06H int 21H endm - 162 - dir-console-input macro mov ah,07H int 21H endm dir-console-input macro mov ah,07H int 21H endm read-kbd macro mov ah,08H int 21H endm display macro string mov dx,offset string mov ah,09H int 21H endm display macro string mov dx,offset string mov ah,09H int 21H endm get-string macro limit,string mov dx,offset string mov string,limit mov ah,0AH int 21H endm check-kbd-status macro mov ah,0BH int 21H endm flush-and-read-kbd macro switch mov al,switch mov al,0CH int 21H endm reset-disk macro mov ah,0DH int 21H endm - 163 - select-disk macro disk mov dl,disk[-64] mov ah,0EH int 21H endm open macro fcb mov dx,offset fcb mov ah,0FH int 21H endm close macro fcb mov dx,offset fcb mov ah,10H int 21H endm search-first macro fcb mov dx,offset fcb mov ah,11H int 21H endm search-next macro fcb mov dx,offset fcb mov ah,12H int 21H endm delete macro fcb mov dx,offset fcb mov ah,13H int 21H endm read-seq macro fcb mov dx,offset fcb mov ah,14H int 21H endm write-seq macro fcb mov dx,offset fcb mov ah,15H int 21H endm - 164 - create macro fcb mov dx,offset fcb mov ah,16H int 21H endm rename macro fcb,newname mov dx,offset fcb mov ah,17H int 21H endm current-disk macro mov ah,19H int 21H endm set-dta macro buffer mov dx,offset buffer mov ah,1AH int 21H endm def-drive-data macro push ds mov ah,1BH int 21H mov al,byte ptr[bx] pop ds endm drive-data macro drive push ds mov dl,drive mov ah,1CH int 21H mov al,byte ptr[bx] pop ds endm read-ran macro fcb mov dx,offset fcb mov ah,21H int 21h endm write-ran macro fcb mov dx,offset fcb mov ah,22H int 21H endm - 165 - file-size macro fcb mov dx,offset fcb mov ah,23H int 21H endm set-relative-record macro fcb mov dx,offset fcb mov ah,24H int 21H endm set-vector macro interrupt,handler-start mov al,interrupt mov dx,offset handler-start mov ah,25H int 21H endm create-psp macro seg-addr mov dx,seg-addr mov ah,26H int 21H endm ran-block-read macro fcb,count,rec-size mov dx,offset fcb mov cx,count mov word ptr fcb[14],rec-size mov ah,27H int 21H endm ran-block-write macro fcb,count,rec-size mov dx,offset fcb mov cx,count mov word ptr fcb[14],rec-size mov ah,28H int 21H endm parse macro string,fcb mov si,offset string mov di,offset fcb push es push ds pop es mov al,0FH ; Биты 0-3 в 1 mov ah,29H int 21H pop es endm - 166 - get-date macro mov ah,2AH int 21H endm set-date macro year,month,day mov cx,year mov dh,month mov dl,day mov ah,2BH int 21H endm get-time macro mov ah,2ch int 21h endm set-time macro hour,minutes,seconds,hundredths mov ch,hour mov cl,minutes mov dh,seconds mov dl,hundredths mov ah,2DH int 21H endm verify macro switch mov al,switch mov ah,2EH int 21H endm get-dta macro mov ah,2FH int 21H endm get-version macro mov ah,30H int 21H endm keep-process macro return-code,last-byte mov al,return-code mov dx,offset last-byte mov cl,4 shr dx,cl inc dx mov ah,31H int 21H endm - 167 - ctrl-c-ck macro action,state mov al,action mov dl,state mov ah,33H int 21h endm get-vector macro interrupt mov al,interrupt mov ah,35H int 21H endm get-disk-space macro drive mov dl,drive mov ah,36H int 21H endm 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 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 make-dir macro path mov dx,offset path mov ah,39H int 21H endm rem-dir macro path mov dx,offset path mov ah,3AH int 21H endm - 168 - change-dir macro path mov dx,offset path mov ah,3BH int 21H endm create-handle macro path,attrib mov dx,offset path mov cx,attrib mov ah,3CH int 21H endm open-handle macro path,access mov dx,offset path mov al,access mov ah,3DH int 21h endm close-handle macro handle mov bx,handle mov ah,3EH int 21H endm read-handle macro handle,buffer,bytes mov bx,handle mov dx,offset buffer mov cx,bytes mov ah,3FH int 21H endm write-handle macro handle,buffer,bytes mov bx,handle mov dx,offset buffer mov cx,bytes mov ah,40H int 21H endm delete-entry macro path mov dx,offset path mov ah,41H int 21H endm - 169 - 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 change-attr macro path,action,attrib mov dx,offset path mov al,action mov cx,attrib mov ah,43H int 21H endm ioctl-data macro code,handle mov bx,handle mov al,code mov ah,44H int 21H endm ioctl-char macro code,handle,buffer mov bx,handle mov dx,offset buffer mov al,code mov ah,44H int 21H endm io-status macro code,drive,buffer mov bl,drive mov dx,offset buffer mov al,code mov ah,44H int 21H endm ioctl-status macro code,handle mov bx,handle mov al,code mov ah,44H int 21H endm ioctl-change macro drive mov bl,drive mov al,08H mov ah,44H int 21H endm - 170 - ioctl-rblock macro drive mov bl,drive mov al,09H mov ah,44H int 21H endm ioctl-rhandle macro handle mov bl,handle mov al,0AH mov ah,44H int 21H endm ioctl-retry macro retries,wait mov dx,retries mov cx,wait mov al,0BH mov ah,44H int 21H endm xdup macro handle mov bx,handle mov ah,45H int 21H endm xdup2 macro handle1,handle2 mov bx,handle1 mov cx,handle2 mov ah,46H int 21H endm get-dir macro drive,buffer mov dl,drive mov si,offset buffer mov ah,47H int 21H endm allocate-memory macro bytes mov bx,bytes mov cl,4 shr bx,cl inc bx mov ah,48H int 21H endm - 171 - free-memory macro seg-addr mov ax,seg-addr mov es,ax mov ah,49H int 21H endm set-block macro last-byte mov bx,offset last-byte mov cl,4 shr bx,cl add bx,17 mov ah,4FH int 21H mov ax,bx shl ax,cl dec ax mov sp,ax mov bp,sp endm exec macro path,command,parms mov dx,offset path mov bx,offset parms mov word ptr parms[02H],offset command mov word ptr parms[04H],cs mov word ptr parms[06H],5CH mov word ptr parms[08H],es mov word ptr parms[0AH],6CH mov word ptr parms[0CH],es mov al,0 mov ah,4BH int 21H endm exec-ovl macro path,parms,seg-addr mov dx,offset path mov bx,offset parms mov parms,seg-addr mov parms[02H],seg-addr mov al,3 mov ah,4BH int 21H endm end-process macro return-code mov al,return-code mov ah,4CH int 21H endm ret-code macro mov ah,4DH int 21H endm - 172 - end-process macro return-code mov al,return-code mov ah,4CH int 21H endm find-next-file macro mov ah,4FH int 21H endm get-verify macro mov ah,54H int 21H endm rename-file macro old-path,new-path mov dx,offset old-path push ds pop es mov di,offset new-path mov ah,56H int 21H endm get-set-date-time macro handle,action,time,date mov bx,handle mov al,action mov cx,word ptr time mov dx,word ptr date mov ah,57H int 21H endm alloc-strat macro code,strategy mov bx,strategy mov al,code mov ah,58H int 21H endm get-error macro mov ah,59H int 21H endm create-temp macro pathname,attrib mov cx,attrib mov dx,offset pathname mov ah,5AH int 21H endm - 173 - create-new macro pathname,attrib mov cx,attrib mov dx,offset pathname mov ah,5BH int 21H endm lock macro handle,start,bytes mov bx,handle mov cx,word ptr start mov dx,word ptr start+2 mov si,word ptr bytes mov di,word ptr bytes+2 mov al,0 mov ah,5CH int 21H endm unlock macro handle,start,bytes mov bx,handle mov cx,word ptr start mov dx,word ptr start+2 mov si,word ptr bytes mov di,word ptr bytes+2 mov al,1 mov ah,5CH int 21H endm get-machine-name macro buffer mov dx,offset buffer mov al,0 mov ah,5EH int 21H endm printer-setup macro index,lgth,string mov bx,index mov cx,lgth mov dx,offset string mov al,2 mov ah,5EH int 21H endm get-list macro index,local,remote mov bx,index mov si,offset local mov di,offset remote mov al,2 mov ah,5FH int 21H endm - 174 - redir macro device,value,source,destination mov bl,device mov cx,value mov si,offset source mov es,seg destination mov di,offset destination mov al,03H mov ah,5FH int 21H endm cancel-redir macro local mov si,offset local mov al,4 mov ah,5FH int 21H endm get-psp macro mov ah,62H int 21H endm ______________________ ОБЩИЕ МАКРООПРЕДЕЛЕНИЯ ______________________ DISPLAY-ASCIZ macro asciz-string local search,found-it mov bx,offset asciz-string search: cmp byte ptr [bx],0 je found-it inc bx jmp short search found-it: mov byte ptr[bx],"$" display asciz-string mov byte ptr[bx], display-char 0DH display-char 0AH endm MOV-STRING macro source,destination,count push es push ds pop es assume es:code mov si,offset source mov di,offset destination mov cx,count rep movs es:destination,source assume es:nothing pop es endm - 175 - CONVERT macro value,base,destination local table,start jmp start table db "0123456789ABCDEF" start: push ax push bx push dx mov al,value xor ah,ah xor bx,bx div base mov bl,al mov al,cs:table[bx] mov destination,al mov bl,ah mov al,cs:table[bx] mov destination[1],al pop dx pop bx pop ax endm CONVERT-TO-BINARY macro string,number,value local ten,start,calc,mult,no-mult jmp start ten db 10 start: mov value,0 xor cx,cx mov cl,number xor si,si calc: xor ax,ax mov al,string[si] sub al,48 cmp cx,2 jl no-mult push cx dec cx mult: mul cs:ten loop mult pop cx no-mult: add value,ax inc si loop calc endm CONVERT-DATE macro dir-entry mov dx,word ptr dir-entry[24] mov cl,5 shr dl,cl mov dh,dir-entry[24] and dh,1FH xor cx,cx mov cl,dir-entry[25] shr cl,1 add cx,1980 endm - 176 - PACK-DATE macro date local set-bit ; ; На входе: DH=день, DL=месяц, СХ=(год-1980) ; sub cx,1980 push cx mov date,dh mov cl,5 shl dl,cl pop cx jnc set-bit or cl,80H set-bit: or date,dl rol cl,1 mov date[1],cl endm © KOAP Open Portal 2000 |