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

Машинно-зависимые языки / Лабораторная работа No

.2.doc
Скачиваний:
14
Добавлен:
17.04.2015
Размер:
68.61 Кб
Скачать

ЛАБОРАТОРНАЯ РАБОТА №2

РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ В ОС MS-DOS

1. ЦЕЛЬ РАБОТЫ

Цель данной работы - изучение приемов работы с файлами и каталогами в ОС MS-DOS и функций DOS, используемых для этого.

2. ОСНОВНЫЕ СВЕДЕНИЯ

2.1. Работа с файлами

Как известно, файловая система MS-DOS представляет собой древовидную совокупность каталогов, каждый из которых может содержать записи о файлах и о каталогах более низкого уровня. Запись о файле содержит его имя, расширение имени, длину в байтах, дату и время последнего изменения, адрес начала файла на диске, а также байт атрибутов.

Смысл разрядов байта атрибутов следующий: бит 0 = 1 - файл доступен только для чтения; бит 1 = 1 - скрытый файл;

бит 2 = 1 - системный файл;

бит 3 = 1 - данная запись каталога является идентификатором тома;

бит 4 = 1 - данная запись каталога является именем подкаталога;

бит 5 = 1 - архивный файл.

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

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

Файл с точки зрения DOS представляет собой совокупность байт, пронумерованных от 0 до максимального значения. Для каждого открытого файла система помнит положение указателя чтения/записи. Этот указатель определяет позицию, начиная с которой будет выполняться очередная операция чтения или записи. Вначале указатель установлен на начальную позицию, при каждой операции чтения или записи он перемещается вперед по файлу. Пользователь может также переместить указатель в любую желаемую позицию. Таким образом, DOS дает возможность выполнять как последовательный, так и прямой доступ к файлам. За одну операцию чтения или записи можно передать любое число байт в пределах 64K.

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

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

В описаниях многих функциях используется понятие "строка, содержащая путь и имя". Имеется в виду строка в коде ASCII, содержащая путь к каталогу и завершающаяся спецификацией файла, например: "C:\DOC\LAB2.TXT". Если задано только имя, то подразумевается текущий каталог. Признаком конца строки служит код 00h. Вместо пути и имени файла может быть задано имя байтового устройства, например, "PRN". В этом случае вместо файла используется устройство.

Функция 3ch: Создание файла. Создает и открывает новый файл с указанным именем в текущем или явно указанном каталоге. Если файл с таким именем ранее существовал, то его длина сбрасывается в 0, т.е. старый файл теряется.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя создаваемого файла.

CX - атрибуты создаваемого файла.

---- Результаты ( при CF = 0 ):

AX = номер файла.

---- Ошибки ( при CF = 1 ):

AX = 3 - неверный путь;

4 - нет свободного номера файла;

5 - доступ отменен ( либо нет места на диске или в каталоге, либо существует одноименный файл, доступный только для чтения ).

Функция 5bh: Создание нового файла. Создает и открывает новый файл с указанным именем в текущем или явно указанном каталоге. Если файл с таким именем уже существует, то новый файл не создается.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя создаваемого файла.

CX - атрибуты создаваемого файла.

---- Результаты ( при CF = 0 ):

AX = номер файла.

---- Ошибки ( при CF = 1 ):

AX = 3 - неверный путь;

4 - нет свободного номера файла;

5 - доступ отменен ( либо нет места на диске или в каталоге, либо существует одноименный файл ).

Функция 5ah: Создание временного файла с уникальным именем. Создает и открывает новый файл, автоматически выбирая ему имя, которое не совпадает ни с одним именем в данном каталоге.

---- Аргументы:

DS:DX - адрес строки, содержащей путь для создания файла. В конце строки после байта 0 должно быть зарезервировано 13 байт.

CX - атрибуты создаваемого файла.

---- Результаты ( при CF = 0 ):

AX = номер файла.

DS:DX - адрес той же строки, теперь содержащей путь и имя созданного файла.

---- Ошибки ( при CF = 1 ):

AX = 3 - неверный путь;

4 - нет свободного номера файла;

5 - доступ отменен ( нет места на диске или в каталоге ).

Функция 41h: Удаление файла. Если файл имеет атрибут "только чтение", то следует предварительно отменить этот атрибут с помощью функции 43h.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя удаляемого файла.

---- Ошибки ( при CF = 1 ):

AX = 2 - файл не найден;

5 - доступ отменен ( например, попытка удаления файла, для которого разрешено только чтение ).

Функция 3dh: Открытие файла. Открывает существующий файл для чтения и/или записи.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя открываемого файла.

AL = 0 - файл открывается только для чтения;

1 - файл открывается только для записи;

2 - файл открывается для чтения и записи.

---- Результаты ( при CF = 0 ):

AX = номер файла.

---- Ошибки ( при CF = 1 ):

AX = 2 - файл не найден;

3 - неверный путь;

4 - нет свободного номера файла;

5 - доступ отменен ( например, попытка записи в файл, для которого разрешено только чтение );

12 - неверный код в AL.

Функция 3eh: Закрытие файла.

---- Аргументы:

BX - номер файла.

---- Ошибки ( при CF = 1 ):

AX = 6 - неверный номер файла.

Функция 42h: Перемещение указателя в файле. Поскольку длина файла может превышать 64K, для задания величины смещения используются 2 регистра. ---- Аргументы:

BX - номер файла.

CX:DX - число байтов, на которые смещается указатель ( CX - старшее слово, DX - младшее слово ).

AL = 0 - смещение отсчитывается от начала файла;

1 - смещение отсчитывается от текущего положения указателя;

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

---- Результаты ( при CF = 0 ):

DX:AX - новое значение указателя.

---- Ошибки ( при CF = 1 ):

AX = 1 - неверный код в AL;

6 - неверный номер файла.

Функция 3fh: Чтение из файла. Выполняется чтение указанного числа байтов, начиная с текущей позиции указателя. Реальное число прочитанных байтов может оказаться меньше заказанного ( при достижении конца файла или конца строки на клавиатуре ). Указатель смещается на число прочитанных байтов.

---- Аргументы:

BX - номер файла.

CX - количество читаемых байтов.

DS:DX - адрес области, куда помещаются прочитанные данные.

---- Результаты ( при CF = 0 ):

AX - количество действительно прочитанных байтов.

---- Ошибки ( при CF = 1 ):

AX = 5 - доступ отменен.

6 - неверный номер файла.

Функция 40h: Запись в файл. Выполняется запись указанного числа байтов, начиная с текущей позиции указателя. Реальное число записанных байтов может оказаться меньше заказанного при отсутствии места на диске. Указатель смещается на число записанных байтов.

Есть еще один вариант применения данной функции. Если указывается значение CX = 0 ( запись 0 байтов ), то DOS устанавливает длину файла равной текущему значению указателя ( обрезает конец файла ).

---- Аргументы:

BX - номер файла.

CX - количество записываемых байтов.

DS:DX - адрес области, откуда берутся данные.

---- Результаты ( при CF = 0 ):

AX - количество действительно записанных байтов.

---- Ошибки ( при CF = 1 ):

AX = 5 - доступ отменен.

6 - неверный номер файла.

2.2. Работа с каталогами

Функция 56h: Переименование или перемещение файла. Файлу с указанным именем присваивается другое имя. Если при этом изменяется и путь, то файл переносится в другой каталог. Но диск должен быть одним и тем же.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя файла.

ES:DI - адрес строки, содержащей новые путь и имя файла.

---- Ошибки ( при CF = 1 ):

AX = 2 - один из путей неверен.

5 - старый путь не содержит имени, или новый путь содержит имя существующего файла.

17 - пути относятся к разным устройствам.

Функция 43h: Работа с атрибутами файла. Данная функция либо читает из каталога значение байта атрибутов файла, либо устанавливает новое значение этого байта.

---- Аргументы:

AL = 0 - прочитать атрибуты;

1 - установить атрибуты.

CX ( при AL=1 ) - новое значение атрибутов.

DS:DX - адрес строки, содержащей путь и имя файла.

---- Результаты ( при CF = 0 ):

CX ( при AL=0 ) - значение атрибутов.

---- Ошибки ( при CF = 1 ):

AX = 1 - неверный код в AL.

3 - путь не найден.

5 - доступ отменен.

Функция 4eh: Поиск первого подходящего файла. Выполняется поиск в каталоге по указанному пути первого имени файла, соответствующего заданной модели. Под моделью понимается имя файла, в котором могут содержаться символы "*" ( означающий любое число любых допустимых символов ) и "?" ( один любой допустимый символ ). Если требуется кроме обычных файлов включить в поиск также скрытые, системные файлы или подкаталоги, то в регистре CX следует установить в 1 соответствующий бит.

В случае успешного поиска запись о найденном файле помещается в системную область, называемую DTA. Адрес этой области ( если сам пользователь его не изменял ) равен 80h относительно значения, которое система при запуске программы загружает в сегментные регистры DS и ES. Структура записи следующая:

Смещение Длина Значение

00h 21 Содержит данные для следующего поиска;

15h 1 Атрибуты файла;

16h 2 Время последнего изменения;

18h 2 Дата последнего изменения;

1ah 2 Младшее слово длины файла;

1ch 2 Старшее слово длины файла;

1eh 13 "Имя.расширение" файла, в конце - код 00h.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и модель имени файла.

CX - значение атрибутов для поиска.

---- Результаты ( при CF = 0 ):

DTA - запись о найденном файле.

---- Ошибки ( при CF = 1 ):

AX = 2 - неверный путь.

18 - подходящий файл не найден.

Функция 4fh: Поиск следующего подходящего файла. Эта функция используется после функции 4eh для поиска следующего файла, имя которого удовлетворяет той же модели. В случае успеха результаты имеют тот же формат, что для функции 4eh.

---- Аргументы: нет.

---- Результаты ( при CF = 0 ):

DTA - запись о найденном файле.

---- Ошибки ( при CF = 1 ):

AX = 18 - подходящий файл не найден.

Функция 39h: Создание каталога.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя создаваемого каталога.

---- Ошибки ( при CF = 1 ):

AX = 3 - путь не найде .

5 - доступ отменен.

Функция 3ah: Удаление каталога. Удаляемый каталог должен быть пуст. Нельзя удалить текущий каталог или корневой каталог диска.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя удаляемого каталога.

---- Ошибки ( при CF = 1 ):

AX = 3 - путь не найден.

5 - доступ отменен.

16 - попытка удалить текущий каталог.

Функция 3bh: Смена текущего каталога. Указанный каталог становится текущим.

---- Аргументы:

DS:DX - адрес строки, содержащей путь и имя нового текущего каталога.

---- Ошибки ( при CF = 1 ):

AX = 3 - путь не найден.

Функция 47h: Информация о текущем каталоге. Функция выдает строку, содержащую путь и имя текущего каталога. Можно получить не только текущий каталог текущего диска, но и тот каталог любого другого диска, который был текущим, когда этот диск был текущим.

---- Аргументы:

DS:SI - адрес области из 64 байт, куда будет записан путь и имя каталога.

DL - номер диска ( 0 - текущий диск, 1 - диск A, 2 - диск B и т.д. ).

---- Результаты ( при CF = 0 ):

DS:SI - адрес строки, содержащей путь и имя каталога.

---- Ошибки ( при CF = 1 ):

AX = 15 - неверный номер диска.

Функция 0eh: Смена текущего диска. Указанный диск становится текущим. ---- Аргументы:

DL - номер диска ( 0 - диск A, 1 - диск B и т.д. ).

---- Результаты:

AL - число дисковых устройств ( включая логические ) в системе.

Функция 19h: Информация о текущем диске.

---- Аргументы: нет.

---- Результаты:

AL - номер текущего диска ( 0 - диск A, 1 - диск B и т.д. ).

3. ВЫПОЛНЕНИЕ РАБОТЫ

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

Создать с помощью текстового редактора файл с текстом программы.

Оттранслировать программу, добиться отсутствия ошибок трансляции.

Запустить и отладить программу.

4. ПРИМЕР ВЫПОЛНЕНИЯ РАБОТЫ

Даны несколько файлов с именами TEXT1.LAB, TEXT2.LAB, TEXT3.LAB и т.д. Требуется получить файл SUMTEXT.LAB, составленный из содержимого всех входных файлов в порядке их размещения в каталоге.

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

Текст программы:

stack SEGMENT para stack 'STACK'

db 100h DUP (?)

stack ENDS

data SEGMENT para public 'DATA'

namadr dd ? ; Адрес имени файла из DTA

ihandle dw ? ; Номер файла для ввода

ohandle dw ? ; Номер файла для вывода

buffer db 1000 dup (?) ; Буфер ввода-вывода

ertxt1 db "Не удалось открыть выходной файл",0dh,0ah,"$"

ertxt2 db "Ошибка при поиске первого исходного файла",0dh,0ah,"$"

ertxt3 db "Не удалось открыть входной файл",0dh,0ah,"$"

ertxt4 db "Ошибка при чтении исходного файла",0dh,0ah,"$"

ertxt5 db "Ошибка при записи в выходной файл",0dh,0ah,"$"

iname db "TEXT?.LAB",0

oname db "SUMTEXT.LAB",0

data ENDS

code SEGMENT para public 'CODE'

ASSUME cs:code, ds:data

TIME equ 0ffffh ; Величина задержки времени

; Начало работы

start: mov ax, data

mov ds, ax ; Загрузить сегм. адрес данных

; Записать в ОЗУ сегмент:смещение для имени файла из DTA

mov ax,es

mov word ptr namadr+2,ax

mov ax,9eh ; Адрес DTA + смещение имени (80h+1eh)

mov word ptr namadr,ax

; Открыть выходной файл

lea dx,oname ; имя выходного файла

mov cx,0 ; обычный файл

mov ah,3ch ; создать файл

int 21h

jnc find1 ; если нет ошибок

lea dx,ertxt1 ; сообщение об ошибке

jmp errors ; на обработку ошибок

; Начать поиск исходных файлов по каталогу

find1:

mov ohandle,ax ; запомнить номер вых.файла

lea dx,iname ; модель имени входных файлов

mov cx,0 ; поиск обычных файлов

mov ah,4eh ; поиск первого подходящего

int 21h

jnc openf

lea dx,ertxt2

jmp errors

; Открыть входной файл и переписать все в выходной

openf: push ds

lds dx,namadr ; адрес найденного имени в ds:dx

mov ax,3d00h ; открыть только для чтения

int 21h

pop ds

jnc readf

lea dx,ertxt3

jmp errors

readf: mov bx,ax ; номер входного файла

mov ihandle,ax ; сохранить его

mov cx,0400h ; число байтов - 1K

lea dx,buffer ; адрес буфера в/в

mov ah,3fh ; читать из файла

int 21h

jnc writef

lea dx,ertxt4

jmp errors

writef: mov cx,ax ; число прочитанных байтов

mov bx,ohandle ; взять номер выходного файла

mov ah,40h ; писать в файл

int 21h

jnc closef

lea dx,ertxt5

jmp errors

closef: mov bx,ihandle ; взять номер входного файла

mov ah,3eh ; закрыть входной файл

int 21h

; Искать следующий файл

nextf: mov ah,4fh

int 21h

jc quit

jmp openf

; Конец работы

quit: mov bx,ohandle

mov ah,3eh ; закрыть выходной файл

int 21h

xor al, al ; код завершения 0

mov ah, 4ch ; выход в DOS

int 21h

; Обработка ошибок

errors: mov ah,09h ; выдать текст на экран

int 21h

jmp quit

code ENDS

END start

5. ВАРИАНТЫ ЗАДАНИЙ

Во всех вариантах задания предполагается, что в отдельном каталоге создано несколько текстовых файлов ( не менее 4 ) с однотипными именами, отличающимися одной цифрой, например, TEXT1.LAB, TEXT2.LAB, TEXT4.LAB, TEXT4.LAB. Эти файлы следует предварительно создать при помощи редактора текстов. Желательно создавать их не в порядке номеров, чтобы положение файлов в каталоге не совпадало с порядком номеров.

5.1. Удвоить текст в каждом файле ( т.е. повторить исходный текст два раза подряд ).

5.2. Создать новый файл, содержащий по 10 последних байтов из каждого исходного файла.

5.3. Перенести все исходные файлы в каталог уровнем выше, а их прежний каталог удалить.

5.4. Разбить каждый файл пополам на 2 файла.

5.5. Найти самый короткий файл и удалить его.

5.6. Слить попарно исходные файлы по порядку номеров: 1 с 2, 3 с 4 и т.д. ( считая, что всего файлов четное число ).

5.7. Оставить в каждом файле первые 20 байт, остальное удалить.

5.8. Создать отдельные каталоги по числу файлов и перенести каждый файл в свой каталог.

6. ФОРМА ОТЧЕТА

Отчет по лабораторной работе должен включать:

- вариант задания;

- текст программы ( желательно в виде листинга трансляции ).

- распечатки исходных файлов и результатов работы.

7. КОНТРОЛЬНЫЕ ВОПРОСЫ

7.1. Что такое текущий каталог?

7.2. Может ли программа работать с несколькими одновременно открытыми файлами? Как при этом указывается нужный файл?

7.3. Какие могут быть неприятности, если не закрыть файл, в который выполнялась запись? А если было только чтение? Оцените в этом плане пример из раздела 4.

7.4. Чем различаются различные функции DOS для создания файла?

7.5. Как перейти в конец файла?

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

7.7. Как найти скрытые файлы?

7.8. В каких случаях нельзя удалить файл? А каталог?