Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

В конце работы файл следует закрыть.

Поиск

4. Признаком ошибки при выполнении функции DOS является взведенный флаг С (переноса).

Количество одновременно открытых файлов (включая предопределенные файлы) не может превышать 20, хотя количество описателей может быть больше. Поскольку 5 первых описателей всегда открыто, то получается, что можно одновременно открыть не более 15 файлов.

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

При закрытии файла содержимое буфера записи сбрасывается на диск, и далее этот буфер может использоваться для работы с другим файлом. Данные незакрытого файла могут оказаться потерянными.

При открытии выделяются буфера отдельно на чтение и запись. В MS DOS имеется функция 68Н, с помощью которой можно сбрасывать буфера, выделенные для записи, на диск, не закрывая файла. Эту функцию часто используют для того, чтобы обезопасить себя от возможной потери данных. Аналог ее имеется во всех языках высокого уровня.

DOS поддерживает как работу с длинными именами, так и с короткими именами файлов и каталогов.


При открытии или создании файла, DOS возвращает в регистр АХ описатель файла или HANDLE -двухбайтное число. Все операции с данным файлом после этого можно производить, зная только это число.

Стандартным устройствам ввода-вывода по умолчанию присваиваются свои описатели - от 0 до 4. Вот эти описатели:

● STDIN стандартное устройство ввода (клавиатура) - 0,

● STDOUT стандартное устройство вывода (экран) -1,

● STDERR устройство для вывода ошибок (обычно экран) - 2,

● AUX асинхронный порт(СОМ1) - 3,

● PRN печатающее устройство (LPT1) - 4.

Это позволяет перенаправить ввод или вывод с одного устройства на другое.

 

Можно выделить четыре аспекта работы с файлами в программах на ассемблере:

– работа с системой файлового ввода-вывода MS DOS, использующей короткие имена;

– работа с системой файлового ввода-вывода MS DOS, использующей длинные имена (длиной до 255 символов);

– работа с системой файлового ввода-вывода Win 32;

– использование файлов особого вида, поддерживаемых Win 32 — проецированных на память.

 


Функция DOS 3Dh — Открыть существующий файл

Ввод: AH = 3Dh

AL = режим доступа

Биты 0-1: открыть для записи или для чтения

Чтение

Запись

Чтение и запись

Биты 2 – 3: зарезервированы (0)

Биты 6 – 4: режим доступа для других процессов

Режим совместимости (остальные процессы также должны открывать этот файл в режиме совместимости)

Все операции запрещены

Запись запрещена

Чтение запрещено

Запрещений нет

Бит 7: файл не наследуется порождаемыми процессами

DS:DX = адрес ASCIZ-строки с полным именем файла

CL = маска атрибутов файлов

Вывод:

CF = 0 и АХ = идентификатор файла, если не произошла ошибка.

CF = 1 и АХ = код ошибки (02h — файл не найден, 03h — путь не найден, 04h — слишком много открытых файлов, 05h — доступ запрещен, 0Ch — неправильный режим доступа)

 

Пример:

LEA DX,PATH; сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0;

; если краткое имя, то берется текущий каталог

MOV AL,2; открыть для чтения и записи, если 0 для чтения,

; 1 – для записи

MOV АН,3DН; функция открытия файла

INT 21H; открываем файл

JC ERRO; ошибка, если поднят флаг СF, в АХ код ошибки,

; если ошибки нет, то в АХ описатель файла для

; будущей работы следует его сохранить

При этом обязательно будет ошибка, если такого файла не существует (в указанном каталоге).


Создание файла с усечением существующего до нулевой длины.

Функция DOS 3Ch — Создать файл

Ввод:

Ah = 3Ch

СХ = атрибут файла

Бит 7: файл можно открывать разным процессам в Novell Netware

бит 6: не используется

бит 5: архивный бит (1, если файл не сохранялся)

бит 4: каталог (должен быть 0 для функции 3Ch)

бит 3: метка тома (игнорируется функцией 3Ch)

бит 2: системный файл

бит 1: скрытый файл

бит 0: файл только для чтения

 

Вывод:

DS:DX = адрес ASCIZ-строки с полным именем файла (ASCIZ-строка ASCII-символов, оканчивающаяся нулем).

CF = 0 и АХ = идентификатор файла, если не произошла ошибка

CF = 1 и АХ = 03h, если путь не найден

CF = 1 и АХ = 04h, если слишком много открытых файлов

CF = 1 и АХ = 05h, если доступ запрещен

 

Если файл уже существует, функция 3Ch все равно открывает его, присваивая ему нулевую длину. Чтобы этого не произошло, следует пользоваться функцией 5Bh.

Функция 5ВН создаёт файл, но если файл уже существует, содержимое его не уничтожается, а взводится флаг ошибки СF.

Пример:

LEA DX,PATH; в сегменте данных путь: С:\ПУТЬ\ИМЯФАЙЛА, 0

; если краткое имя, то берется текущий каталог

MOV СХ,0; создать только для чтения, если 0 - для чтения, 1 –

; для записи

MOV АН,3СН; функция создания файла

INT 21h; открываем файл

JC ERRO; ошибка, если поднят флаг СF, в АХ код ошибки,

; если ошибки нет, то в АХ описатель файла, для

; будущей работы следует его сохранить


Пример 10.1. Создание файла и запись в него строки 'Файл номер 1'.

; В сегменте данных

.data

bufout db 'Файл номер 1'; Данные для записи в файл

buflen=$-bufout; строка длиной в 12 байт

handle dw 0; Ячейка для дескриптора

fname db 'MYFILE.txt',0;Имя файла в формате ASCIIZ

 

;В сегменте команд создадим файл

.code

mov АН,3Ch; Функция создания файла

mov CX, 0; Без атрибутов

mov DX, offset fname; Адрес имени файла

int 21h

mov handle,AX; Сохраним дескриптор файла

; Запишем в файл данные (в данном

; примере – текстовую строку)

mov AH,40h; Функция записи в файл

mov BX,handle; Дескриптор

mov CX,buflen; Число записываемых байтов

mov DX,offset bufout; Адрес данных

int 21h

; Закроем файл

mov АН,3Eh; Функция закрытия файла

mov BX,handle; Дескриптор

int 2lh


Функция WinAPI для создания файла

HANDLE CreateFile(

CLPCTSTR lpFileName, (1)

DWORD dwDesiredAccess, (2)

DWORD dwShareMode, (3)

LPSECURITY_ATTRIBUTES IpSecurityAttributes, (4)

DWORD dwCreationDistribution, (5)

DWORD dwFlagsAndAttributes, (6)

HANDLE hTemplateFile); (7)

0) lpFileName — указатель на ASCIIZ-строку с именем (путем) открываемого или создаваемого файла;

1) dwDesiredAccess — тип доступа к файлу:

* GENERIC_READ = 80000000h - доступ для чтения;

* GENERIC_WRITE = 40000000h - доступ для записи;

* GENERIC_READ+GENERIC_WRITE = 0C0000000h - доступ для чтения-записи;

2) DwShareMode — режим разделения файлов между разными процессами, данный параметр может принимать значения:

* 0 — монополизация доступа к файлу;

* FILE_SHARE_READ = 00000001h — другие процессы могут открыть файл, но только для чтения, запись в файл монополизирована процессом, открывшим файл;

* FILE_SHARE_WRITE = 00000002h — другие процессы могут открыть файл, но только для записи, чтение в файл монополизировано процессом, открывшим файл;

* FILE_SHARE_READ+FILE_SHARE_WRITE = 00000003h - другие процессы могут открывать файл для чтения-записи;

3) IpSecurityAttributes — указатель на структуру SecurityAttributes, определяющую защиту связанного с файлом объекта ядра, при отсутствии защиты заносится NULL;

4) dwCreationDistribution — определяет действия для случаев, когда файл существует или не существует. Данный параметр может принимать значения:

* CREATE_NEW= 1 — создать новый файл, если файл не существует; если файл существует, то функция завершается формированием ошибки;

* CREATE_ALWAYS=2 — создать новый файл, если файл не существует; если он существует, то заменить новым;

* ОPEN_EXISTING=3 — открыть файл, если он существует; если файл не существует, то формируется ошибка;

* ОPEN_ALWAYS=4 — открыть файл при его существовании и создать его если файла нет;

* TRUNCATE_EXISTING=5 — открыть файл с усечением его до нулевой длины; если файл не существует, то формируется ошибка;

5) DwFlagsAndAttributes — флаги и атрибуты; этот параметр используется для задания характеристик создаваемого файла:

* FILE_ATTRIBUTE_READ0NLY=0000000lh - файл только для чтения;

* FILE_ATTRIBUTE_HIDDEN=00000002h - скрытый файл;

* FILE_ATTRIBUTE_SYSTEM=00000004h - системный файл;

* FILE_ATrRIBUTE_DIRECTORY=000000l0h - каталог;

* FILE ATTRIBUTE ARCHIVE=00000020h - архивный файл;

* FILE_ATTRIBUTE_N0RMAL=00000080h - обычный файл для чтения-записи (этот атрибут нельзя комбинировать с другими);

* FILE_ATTRIBUTE_TEMPORARY=00000l00h - создается временный файл (преимущество этого файла в том, что система стремится не записывать этот файл на диск, а работать с ним в памяти; этот атрибут выгодно комбинировать с флагом FILE_FLAG_DELETE_ON_CLOSE, тогда после закрытия файла в программе он будет удален, не оставив следов на диске, иначе программе придется «подчищать» за собой содержимое диска);

* FILE_FLAG_WRITE_THRОUGH=80000000h - не использовать промежуточное кэширование при записи на диск, а все изменения записывать прямо на диск;

* FILE_FLAG_NO_BUFFERING=20000000h - не использовать средства буферизации операционной системы;

* FILE_FLAG_RANDOM_ACCESS=10000000h - прямой доступ к файлу (установка этого флага или флага FILE_FLAG_SEQUENTIAL_SCAN позволяет оптимизировать системе процесс кэширования);

* FILE_FLAG_SEQUENTIAL_SCAN=08000000h - последовательный доступ к файлу;

* FILE_FLAG_DELETE_0N_CL0SE=04000000h - удалить файл после его закрытия;

* FILE_FLAG_OVERLAPPED=40000000h - асинхронный доступ к файлу (синхронность означает то, что программа, вызвавшая функцию для доступа к файлу, приостанавливается до тех пор, пока не закончит работу функция ввода-вывода);

6) hTemplateFile — дескриптор другого существующего и предварительно открытого файла. Параметр используется только при создании нового файла. Новый файл создается с теми же значениями атрибутов и флагов, что и у файла, дескриптор которого указан в параметре hTemplateFile.

 

При удачном завершении функция возвращает в регистре ЕАХ дескриптор нового файла. В случае неудачи функция возвращает в регистре ЕАХ значение NULL.


Пример 1:

.code

mov eax,offset filename

mov fname,eax

push 00000000h; Создаём новый файл с новыми параметрами

push 00000080h; создаём обычный файл для чтения-записи

push 00000003h; открываем файл, если он существует; если файл

; не существует, то формируется ошибка;

push 00000000h; нет защиты при создании файла

push 00000001h; другие процессы могут открыть файл, но только

; для чтения,

push 0C0000000h; тип доступа к файлу - доступ для чтения-записи;

push fname; путь к открываемому или создаваемому файлу;

call CreateFileA

cmp eax,FFFFFFFFh

je exit

.data

filename db 'data.txt',0

 

Пример 2:

.code

mov eax,offset filename

mov fname,eax

push 0h; hTemplateFile = NULL

push 80h; Attributes = NORMAL

push 3h; Mode = OPEN_EXISTING

push 0h; pSecurity = NULL

push 3h; ShareMode = FILE_SHARE_RW

push 3h; Access = READ

push fname; 'data.txt'

call CreateFileA

push eax

.data

filename db 'data.txt',0

 

После выполнения функции в ЕАХ будет расположен хендл открытого файла. В случае ошибки ЕАХ будет равен FFFFFFFFh = -1. После вызова функции можно сохранить хендл файла в стек для дальнейшей работы.




Поделиться:


Последнее изменение этой страницы: 2016-09-13; просмотров: 306; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.199.54 (0.011 с.)