Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МАВЦ.464319.001ТУ 20140414 Семенов.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
2.98 Mб
Скачать

5.8 Программирование работы с файлами

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

Запись идентифицируется своим адресом:

адрес_записи = имя_файла:номер_записи.

Файловая система поддерживает два типа доступа к записям файла:

  • последовательный метод доступа;

  • прямой метод доступа.

Механизм доступа к файлу и его записям при программировании имеет два варианта:

  • доступ к файлу с использованием специальной таблицы — управляющего бло­ка файла (FCB);

  • доступ к файлу по идентификатору (ASCIIZ).

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

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

  • Прерывания BIOS:

  • 13Н — обмен данными с жестким диском (если «винчестера» у ПК нет, то с гибким диском);

  • 40Н — обмен данными с гибким диском (если есть жесткий диск).

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

  • Прерывание DOS 2H.

Имеется несколько десятков различных вариантов прерывания 21Н (опреде­ляемых содержимым регистра АН), реализующих так называемые универсаль­ные функции управления файлами при наличии любых версий MS-DOS (ис­пользующих при обращении к файлам FCB) и несколько десятков вариантов прерывания, реализующих так называемые расширенные функции управления файлами при наличии версии MS-DOS 2.0 и выше (использующих при обра­щении к файлам строку ASCIIZ).

Ниже обсуждаются лишь наиболее популярные варианты прерывания 21Н DOS, реализующие расширенные функции управления файлами.

При прерываниях этого типа файл полностью идентифицируется ASCIIZ-строкой, а после открытия файла — логическим номером, присваиваемым файлу при его создании и открытии (после закрытия файла его логический номер удаляется).

Сводка некоторых служебных функций DOS прерывания 21Н.

  • АН=ЗСН — создание файла: формируются ASCIIZ-строка, идентифицирующая файл и атрибут файла; вектор-адрес ASCIIZ-строки файла помещают в регистры DS: ОХ, в регистр СХ помещают атрибут файла; в регистре АХ возвращается логический номер файла.

  • AH=3DH — открытие файла: вектор-адрес ASCIIZ-строки помещают в регистры DS: DX, в регистр AL записывается признак возможной работы с файлом (AL=0 – файл открывается только для чтения, AL=1 — только для записи, АL=2 — и для чтения, и для записи); в регистре АХ возвращается логический номер файла.

  • АH=3EH — закрытие файла (закрытие его логического номера): логический но­ мер помещают в регистр ВХ.

  • AH=3FH — чтение из файла: в регистр ВХ помещают логический номер, в СХ - число считываемых байтов, в DS:DX — вектор-адрес буфера (поля ОЗУ), от веденного для записи считываемой информации; число фактически считанных байтов возвращается в регистре АХ.

  • АН=40 — запись в файл: в регистр ВХ помещают логический номер, в СХ — число записываемых байтов, в DS: DX — вектор-адрес буфера (поля ОЗУ), храня­щего записываемую информацию; в АХ возвращается число фактически за­писанных байтов.

  • АН=41 — удаление файла: в регистры DS:DX заносится вектор-адрес ASCIIZ- строки файла.

  • АН=42 — установка указателя текущей записи в файле: в регистр ВХ заносится логический номер, в регистре AL — указание на базовую установку указате­ля текущей записи (А1_=0 — начало файла, А1_=1 — прежнее значение текущей записи, А1_=2 — конец файла), в регистры CX:DX — смещение указателя относительно базовой установки (чаще всего 0); в регистрах DX: АХ возвращается смещение текущей записи файла относительно начала файла.

  • АН=43 — установка нового атрибута файла: в регистры DS: DX заносится адрес ASCIIZ-строки файла, в СХ — новый атрибут, в AL заносится «1» (если в AL — «О», то чтение атрибута, который возвращается в СХ).

  • АН=56 — переименование файла: в регистры DS:DX заносится адрес ASCIIZ-строки со старым именем файла, в регистры DS:DX заносится адрес ASCIIZ-строки с новым именем файла.

При всех названных прерываниях при появлении ошибки в выполнении процедуры в регистре FL флаг CF устанавливается в «1»; код ошибки возвращается в регистре АХ. Ниже приводятся фрагменты программ работы с файлами по ASCIIZ-строке при следующих форматах данных:

path db C:filename.ext, 0

buf db 1000 dup(?)

han dw ?

size dw ?

; ASCIIZ-строка

: буфер обмена

; логический номер

; размер файла

Чтение из файла:

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

mov DX, offset path

mov AL, 0

mov AH, 3DH

int 21H

jc open_error

mov han, AX

Определение размера файла:

; адрес ASCIIZ-строки в DX

; открываем только для чтения

; функция открытия файла

; код прерывания

; если CF-1,- обработка ошибки открытия файла

; запись логического номера

mov АН, 42Н

mov AL, 2

mov BX, han

mov CX, 0

mov DX, 0

Int 21H

jc point_error1

mov size. AX

; установка указателя текущей позиции

; код установки в конец файла

; запись логического номера

; смещение - О

; смещение - О

; код прерывания

; если CF-1,- обработка ошибки установки указателя

; запись размера файла

Установка указателя в начало файла:

mov АН, 42Н

mov AL, О

mov CX, 0

mov DX, О

Int 21H

jc point_error2

; если CF-1,- обработка ошибки установки указателя

Чтение файла:

mov АН, 3FH

mov BX, han

mov CX, size

mov DX, offset buf

Int 21H

jc read_error

; если CF-1,- обработка ошибки чтения из файла

; установка указателя текущей позиции код ; установки в начало файла

смещение – О

смещение – О

; функция чтения из файла

; запись логического номера

; запись размера файла

; запись адреса буфера обмена

; код прерывания

код прерывания

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

mov BX. пап ; запись логического номера

mov АН, ЗЕН ;

функция закрытия файла

Int 21H ; код прерывания

jc close_erro r

; если CF=1, - обработка ошибки закрытия файла

Запись в файл:

  • Полная перезапись файла.

; Открытие (создание) файла

mov DX, offset path

mov CX, 0

mov АН, ЗСН

Int 21H

jc open_error

mov han. AX

; Запись в файл 500 байт

mov АН, 40Н

mov BX, han

mov CX, 500

mov DX, offset buf

Int 21H

jc write_error

  • Добавление записей в файл.

; Открытие файла ,

mov DX offset path

mov AL, 1

mov AH, 3DH

Int 21H

jc open_error

mov han, AX

; Установка указателя в конец файла

mov BX, AX

mov CX. 0

mov DX, О

mov AL, 2

mov АН. 42Н

Int 21H

jc point_error

; Запись в файл 300 байт

mov АН. 40Н

mov BX, han

mov CX. 300

mov DX. offset buf

Int 21H

jc write_error