Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1543
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

133

CF=1 и AX=код ошибки, если произошла ошибка (7100h – функция не поддерживается)

6.4.5. Управление директориями

39h (INT 21h) — создать директорию

Создает директорию по указанному пути.

Входные данные:

AX=39h

DS:DX=адрес ASCIIZ-строки с путем, в котором все директории, кроме последней, существуют.

Возвращаемые значения:

CF=0, если директория создана

CF=1 и AX=3, если путь не найден; 5, если доступ запрещен

LFN 39h (INT 21h) — создать директорию с длинным именем

Входные данные:

AX=7139h

DS:DX=адрес ASCIIZ-строки с путем

Возвращаемые значения:

CF=0, если директория создана

CF=1 и AX=код ошибки (7100h, если функция не поддерживается)

3Ah (INT 21h) — удалить директорию

Входные данные:

AX=3Ah

DS:DX=адрес ASCIIZ-строки с путем, где последняя директория будет удалена (только если она пустая)

Возвращаемые значения:

CF=0, если директория удалена

CF=1 и AX=3, если путь не найден; 5, если доступ запрещен; 10h, если удаляется директория - текущая

LFN 3Ah (INT 21h) — удалить директорию с длинным именем

Входные данные:

AX=713Ah

DS:DX=адрес ASCIIZ-строки с путем

Возвращаемые значения:

CF=0, если директория удалена

CF=1 и AX=код ошибки

47h (INT 21h) — определить текущую директорию

Входные данные:

AH=47h

DL=номер диска (00h – текущий, 01h – A и т. д.)

DS:SI = 64-байтный буфер для текущего пути (ASCIIZ-строка без имени диска, первого и последнего символа \)

Возвращаемые значения:

http://www.sklyaroff.ru

134

CF=0 и AX=0100h, если операция выполнена

CF=1 и AX=0Fh, если указан несуществующий диск

LFN 47h (INT 21h) — определить текущую директорию с длинным именем

Входные данные:

AH=7147h

DL=номер диска

DS:SI = буфер для пути (ASCIIZ-строка без имени диска, первого и последнего символа \. Необязательно содержит лишь длинные имена – возвращается тот путь, который использовался при последней смене текущей директории.)

Возвращаемые значения:

CF=0 , если директория определена

CF=1 и AX=код ошибки

3Bh (INT 21h) — сменить директорию

Входные данные:

AH=3Bh

DS:DX = адрес 64-байтного ASCIIZ-буфера с путем, который станет текущей директорией

Возвращаемые значения:

CF=0, если директория изменена

CF=1 и AX=3, если путь не найден

LFN 3Bh (INT 21h) — сменить директорию с длинным именем

Входные данные:

AH=713Bh

DS:DX = адрес ASCIIZ-буфера с путем

Возвращаемые значения:

CF=0, если директория изменена

CF=1 и AX=код ошибки

Перед работой с любыми функциями LFN следует один раз вызывать подфункцию 0A0h, чтобы определить размеры буферов для имен файлов и путей.

Кроме того, при вызове любой функции LFN следует установить CF в 1 для совместимости с ранними версиями DOS. Старые версии DOS не изменяли CF, так что в результате, если функция не поддерживается, CF останется равным 1.

В листинге 6.6 приведена программа, демонстрирующая работу с файлами. Она создает на диске файл, делает в него запись и закрывает файл. Затем открывает созданный файл, перемещает позицию чтения/записи на пятый байт файла, считывает участок строки с пятого байта до конца строки, выводит его на экран, после чего закрывает файл. Файл, с которым работает программа текстовый. Он выбран только для наглядности. Принципы работы с другими типами файлов ничем не отличаются от принципов работы с текстовыми.

После выполнения любой функции для работы с файлами и директориями в случае ошибки устанавливается флаг CF=1 (см. описание каждой функции выше). Поэтому в программе проверяется этот флаг после вызова каждой функции с помощью инструкции JC, если флаг установлен, выводится ошибка. Это самый простой подход, лучше, чтобы программа анализировала код ошибки и выдавала более подробную информацию об ошибке.

http://www.sklyaroff.ru

135

Листинг 6.6. Программа, демонстрирующая работу с файлами (dosfile.asm)

.model

tiny

.code

 

org

100h

start:

 

; Создание файла

mov

ah,03Ch

mov

cx,0

mov

dx,offset FileName

int

21h

jc

error

; Сохранение файлового дескриптора mov [FileNumber],ax

; Запись строки в файл

mov

ah,040h

mov

bx,[FileNumber]

mov

cx,12

mov

dx,offset TextLine

int

21h

jc

error

; Закрытие файла

mov

bx,[FileNumber]

mov

ah,03Eh

int

21h

; Открытие файла для чтения

mov

ax,03D00h

mov

dx,offset FileName

int

21h

jc

error

; Сохранение файлового дескриптора mov [FileNumber],ax

; Установка позиции на пятый байт файла

mov

ax,04200h

mov

bx,[FileNumber]

mov

cx,0

mov

dx,5

int

21h

jc

error

; Чтение файла в специально отведенное место mov ah,03Fh