Имена файлов, каталогов или шаблонов для поиска должны записываться в ASCIIZ-формате, то есть в конце имени указывается нулевой байт.




Министерство образования и науки украины

Одесская Государственная Академия Холода

 

 

Лабораторная работа №7

По дисциплине: «Компьютерная схемотехника»

Тема: «РАБОТА С ФАЙЛАМИ »

 

Выполнила: студентка гр.526

Кикинчук О.А.

 

 

Одесса 2012


Теоретическая часть

Работа с файлами. Подсистема учета размещения информации на устройстве внешней памяти называется файловой системой. От нее зависит, какая единица пространства памяти является наименьшей, могут ли файлы занимать несвязанные участки памяти, как именуются файлы, какими свойствами может обладать файл и какие операции над ним можно производить и т. п. В DOS для дисковых накопителей используется файловая система FAT. Она позволяет разделять дисковое пространство HDD на несколько разделов и организовывать в каждом из разделов иерархическую структуру каталогов, содержащих файлы. Каталог, обычно представляемый в виде именованной совокупности файлов, также по сути является файлом определенной структуры, содержащим список хранящихся в нем файлов. (Для работы с каталогами в DOS имеются специальные функции).

Имя файла (и, соответственно, каталога) может содержать от 1 до 8 символов непосредственно в имени и от 0 до 3 символов — в расширении файла, обычно поясняющем его тип. Имя и расширение отделяются точкой. Суммарная длина имени, таким образом, составляет максимум 12 байт.

DOS поддерживает ряд следующих функций для работы с файлами:

 

№ в AH Описание Вход Выход
3Сh/5Bh Создать файл/ новый файл DS:DX ® ASCIIZ-имя файла*; CX = атрибуты AX = дескриптор
3Dh Открыть файл DS:DX ® ASCIIZ-имя файла; AL = код доступа (0 - чтение, 1 - запись, 2 - чтение/запись) AX = дескриптор
3Eh Закрыть файл BX = дескриптор  
3Fh Читать из файла BX = дескриптор; CX = число байт; DS:DX ® буфер-приемник AX = число считанных байт
40h Писать в файл BX = дескриптор; CX = число байт; DS:DX ® буфер-источник AX = число записанных байт
42h Установить указатель BX = дескриптор; CX:DX = сдвиг в байтах; AL = код метода (сдвиг относи-тельно: 0 - начала файла; 1 – те­кущего положения; 2 - конца файла) DX:AX = текущее положение указателя относительно начала файла
43h Получить/уста-новить атрибуты файла DS:DX ® ASCIIZ-имя файла; AL = 0 - получить, 1 - установить; CX = новый атрибут (при AL = 1) CX = текущий атрибут (при AL = 0)
57h Получить/уста-новить дату и время создания AL = 0 - получить, 1 - установить; BX = дескриптор; CX = новое вре­мя, DX = новая дата (при AL = 1) CX = время, DX = дата (при AL = 0)
39h Создать каталог DS:DX ® ASCIIZ-имя каталога  
3Ah Удалить каталог DS:DX ® ASCIIZ-имя каталога  
41h Удалить файл DS:DX ® ASCIIZ-имя файла  
47h Получить полное имя текущего каталога DS:SI ® буфер для имени (до 64 б); Dl = номер диска (0 = текущий, 1 = A, 2 = B и т. д.) полное имя в буфере в формате ASCIIZ
4Eh Найти первый файл DS:DX ® ASCIIZ-имя/маска; CX = атрибуты [DTA+15h] - атрибут; [DTA+16h] - дата; [DTA+18h] - время; [DTA+1Ah] - размер; [DTA+1Eh] - ASCIIZ-имя или CF = 1 (не найден)
4Fh Найти следующий файл Данные в DTA после предыдущего поиска
56h Переименовать файл DS:DX ® ASCIIZ-старое имя; ES:DI ® ASCIIZ-новое имя  
5Ah Создать уникальный файл DS:DX ® ASCIIZ – диск:\путь\; CX = атрибуты AX = дескриптор; DS:DX ® ASCIIZ - полное имя

 

*ASCIIZ – '(путь\)имя',0 (если путь не указан, используется текущий каталог).

 

Все функции в случае ошибки устанавливают CF и возвращают в AX код ошибки:

 

Hex   Dec Значение Hex   Dec Значение
    Неверный номер функции Файл не найден Путь не найден Слишком много открытых файлов Доступ не разрешен Неверный дескриптор Разрушены блоки упр. памятью Недостаточно памяти Неверный адрес блока памяти 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h   Неверное окружение Неверный формат Неверный код доступа Неверная дата (не используется) Задан неверный диск Нельзя удалять тек. каталог Не то устройство Больше нет искомых файлов

 

Стандартные дескрипторы:

 

0 CON - стандартный ввод (клавиатура);

1 CON - стандартный вывод (экран);

2 стандартное устройство ошибок (экран);

3 AUX - асинхронный адаптер (COM1);

4 стандартный принтер (LPT1).

 

Атрибуты (биты):

 

  a d s v h r

a - (archive) архивный;

d - (directory) каталог;

v - (volume) метка тома;

s - (system) системный;

h - (hidden) скрытый;

r - (read only) только для чтения.

 

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

Начиная с версии 2 в MS-DOS используется дескрипторный метод работы с файлами. При создании или открытии файлу присваивается 16-разрядный двоичный номер, называемый дескриптором (или описателем). В дальнейшем при выполнении операций чтения, записи и других необходимо указывать присвоенный файлу дескриптор.

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

Имена файлов, каталогов или шаблонов для поиска должны записываться в ASCIIZ-формате, то есть в конце имени указывается нулевой байт.

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

Поиск группы файлов, имена которых удовлетворяют определенному шаблону, выполняется в два этапа. На первом этапе используется функция ’Найти первый файл’, при этом указывается шаблон, который может содержать путь к обрабатываемому каталогу и шаблонные символы ’*’ (последовательность допустимых символов произвольной длины) и ’?’ (любой допустимый символ в данной позиции). Если путь не указан, подразумевается текущий каталог (это справедливо и в других подобных случаях). Если файл не найден, устанавливается флаг CF, иначе информация о найденном файле записывается в область DTA. На втором этапе вызывается функция ’Найти следующий файл’, которая использует информацию из DTA после предыдущего поиска. Эта функция при каждом новом вызове находит следующий файл, удовлетворяющий первоначальному шаблону. Файлы находятся в порядке их следования в записи каталога. Подкаталоги не обрабатываются.

Наряду со служебной информацией, обеспечивающей возможность поиска очередного файла, в DTA записываются сведения об атрибутах, дате и времени модификации, размере найденного файла, а также имя файла (без пути) в формате ASCIIZ. Если длина имени с расширением составляет менее 12 байт, остаток поля заполняется нулями.

Ниже приведен пример простой программы, иллюстрирующей использование файловых функций. Осуществляются создание файла в текущем каталоге, запись в него текстовой строки и закрытие файла. (В простых программах, подобных этой, явное закрытие файла можно не производить, так функция 4Ch автоматически закрывает все открытые файлы перед возвратом управления операционной системе).

 

; Данные

fname db '1.txt', 0; ASCIIZ-имя файла

string db 'Данные'; записываемая строка

len = $-string; длина строки

ermes db 'Ошибка создания файла!'

 

; Код

assume cs:cod, ds:dat

b: mov ax, dat

mov ds, ax; инициализация DS адресом сегмента данных

; Создадим файл

mov ah, 3Ch; функция ’Создать файл’

lea dx, fname; DS:DX -> ASCIIZ-имя

xor cx, cx; без атрибутов

int 21h

jc er; если ошибка – на обработку

; Запишем в файл строку

mov bx, ax; сохраним дескриптор созданного файла

mov ah, 40h; функция записи в файл или на устройство

lea dx, string; DS:DX -> записываемая строка

mov cx, len

int 21h

; Закроем файл (в BX - дескриптор)

mov ah, 3Eh

int 21h

exit: mov ax, 4C00h

int 21h

; Обработка ошибки создания файла

er:

...; вывод сообщения ermes

jmp exit

 

Возвращаемый функцией создания файла дескриптор сразу помещается в регистр BX, поскольку это требуется функцией записи. Функция записи не влияет на содержимое регистра BX, поэтому перед закрытием файла его можно не инициализировать заново — там и так находится нужный дескриптор.

Задание

3. В конец файла с расширением ASM в текущем каталоге дописать строку «Done». Создать новый файл PROCESS.NUM и выдать сообщение об успешном завершении работы.

Решение

data segment;сегмент данных

fname db 'PROCESS.NUM ', 0; ASCIIZ-имя файла

find db 'lab7.asm',0

string db ';Done'; записываемая строка

len = $-string; длина строки

ern db 'File doesnt create!$'

erf db 'File doesnt find!$'

mok db 'OK. All right!$'

data ends;конец сегмента данных;

 

code segment;сегмент кода

assume cs:code,ds:data;инициализация сегментов

begin proc;начало программы

mov ax,data

mov ds,ax

mov ax,3D02h; функция открыть файл на чтение-запись

lea dx, find

int 21h

jc er

; Запишем в файл строку

mov bx, ax; сохраним дескриптор созданного файла

mov ah, 42h;перемести муказатель

mov al,2;в конец

mov cx,0;смещение относительно конца

int 21h

 

mov ah, 40h; функция записи в файл или на устройство

lea dx, string; DS:DX -> записываемая строка

mov cx, len;её длина

int 21h

; Закроем файл (в BX - дескриптор)

mov ah, 3Eh

int 21h

 

mov ah, 9

lea dx, mok

int 21h

; Создадим файл

mov ah, 3Ch; функция ’Создать файл’

lea dx, fname; DS:DX -> ASCIIZ-имя

xor cx, cx; без атрибутов

int 21h

jc er; если ошибка – на обработку

mov bx, ax; сохраним дескриптор созданного файла

; Обработка ошибки создания файла

er:

cmp ax,2

je fn

cmp ax,7

je error

jmp exit

 

 

exit: mov ax, 4C00h

int 21h

fn:

mov ah, 9

lea dx, erf

int 21h

jmp exit

error: mov ah, 9

lea dx, ern

int 21h

code ends

end begin

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: