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

Тема: Работа с файлами.

Цель работы: Получить навыки организации подпрограмм и навыки работы с файлами через описатели.

1. Задание: Разработать программу вывода строковых данных в файл. Строка вводится с клавиатуры, во введенной строке заменить символы «.» на «,» и вывести результирующую строку в файл. Работа с файлами должна осуществляться через описатели. В программе должны использоваться подпрограммы.

Замечания:

1. Имя файла должно вводиться с клавиатуры.

2. Если файл с введенным именем не существует, то программа должна выдать запрос о необходимости создания файла.

Пояснения:

Подпрограммы. Программный сегмент может разбиваться на части директивами определения подпрограмм (процедур). Для определения процедур используются две директивы — директива начала PROC и директива конца ENDP. Процедура должна иметь имя, которое включается в обе директивы. В сегменте кода процедуры могут располагаться последовательно, а могут быть вложенными одна в другую.

Существует несколько разновидностей команды вызова процедуры CALL. Все команды вызова безусловны и используются для передачи управления процедуре. Внутрисегментный вызов NEAR CALL используется для передачи управления процедуре, находящейся в том же сегменте. Межсегментный вызов FAR CALL используется для передачи управления процедуре, находящейся в другом сегменте или даже программном модуле.

Командам CALL соответствуют команды возврата RET. Все возвраты — косвенные переходы, поскольку извлекают адрес перехода из вершины стека. Внутрисегментный возврат извлекает из стека одно слово и помещает его в регистр IP, а межсегментный возврат извлекает из стека два слова, помещая слова из меньшего адреса в регистр IP, а слово из большего адреса — в регистр CS. Оператор RET может иметь операнд, который представляет собой значение, прибавляемое микропроцессором к содержимому указателя стека SP после извлечения адреса возврата.

Работа с файлами. Если программы, написанные на языках высокого уровня, могут открыть файл без выполнения подготовительных действий (они выполняются автоматически), то ассемблерные программы должны создать специальные области данных, которые используются при операциях ввода/вывода. Используется два метода доступа к файлам: метод управляющего блока файла (FCB) и метод дескриптора файла. С помощью метода FCB можно получить доступ только к файлам, находящимся в текущем каталоге. Метод дескриптора файла позволяет получить доступ к любому файлу, независимо от того, какой каталог является текущим.

Начиная с DOS версии 2.0, в набор функций прерывания 21h включены UNIX-подобные файловые функции. Идея их состоит в том, что, когда программа открывает файл, DOS возвращает 16-битовое значение «описателя файла» (дескриптора файла) (handle). После этого, когда программа читает, позиционирует, пишет или закрывает файл, она ссылаетесь на него через описатель. Одно из самых больших удобств — то, что можно обращаться к некоторым устройствам так, как будто это дисковые файлы, через зарезервированные описатели DOS:

Handle Наименование и описание
  Стандартное устройство ввода (обычно клавиатура)
  Стандартное устройство вывода (обычно экран)
  Стандартное устройство ошибок (всегда CON — экран. Для сообщений)
  Стандартное устройство AUX (асинхронный адаптер; 1-й послед. порт — COM1)
  Стандартный принтер (1-й параллельный порт принтера — L PT1)

Ниже приведен перечень наиболее часто используемых функций прерывания 21h для работы с файлами через описатели.

Функция 3cH

Создать файл.

Вход: AH=3ch

DS:DX=адрес строки ASCIIZ с именем файла

CX=атрибут файла

Выход: AX=код ошибки, если CF установлен и описатель файла, если ошибки нет

Описание: Файл создается в указанном (или умалчиваемом) оглавлении и открывается в режиме доступа «чтение/запись». Если файл уже существует, то при открытии файл усекается до нулевой длины. Если атрибут файла — «только чтение», открытие отвергается (атрибут можно изменить функцией 43H).

Функция 5bH

Создать новый файл (не должен существовать).

Вход: AH=5bh

DS:DX=адрес строки ASCIIZ с именем файла

CX=атрибут файла

Выход: AX=код ошибки, если CF установлен и описатель файла, если ошибки нет

Описание: Этот вызов идентичен функции 3ch, с тем исключением, что он вернет ошибку, если файл с заданным именем уже существует.

Функция 5aH

Создать уникальный файл.

Вход: AH=5ah

DS:DX=адрес строки ASCIIZ с путем (заканчивается \)

CX=атрибут файла

Выход: AX=код ошибки, если CF установлен и описатель файла, если ошибки нет

DS:DX (не изменяется) становится полным ASCIIZ-именем нового файла.

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

Функция 3dH

Открыть файл.

Вход: AH=3dh

DS:DX=адрес строки ASCIIZ с именем файла

AL=режим открытия

Выход: AX=код ошибки, если CF установлен и описатель файла, если ошибки нет

Описание: В момент открытия файл должен существовать. Файл открывается в выбранном режиме доступа (AL=0 — для чтения; AL=1 — для записи; AL=2 — для чтения и записи) и указатель «чтения/записи» устанавливается в 0.

Функция 3eH

Закрыть файл.

Вход: AH=3eh

BX=описатель файла

Выход: AX= код ошибки, если CF установлен

Описание: BX содержит описатель файла (handle), возвращенный при открытии. Файл, представленный этим описателем, закрывается, его буфер сбрасываются, а оглавление обновляется корректными размером, временем и датой.

Функция 41H

Удалить файл.

Вход: AH=41h

DS:DX=адрес строки ASCIIZ с именем файла

Выход: AX=код ошибки, если CF установлен

Описание: Имя файла не может содержать обобщенные символы («?» и «*»). Файл удаляется из заданного оглавления заданного диска. Если файл имеет атрибут только чтение, то перед удалением необходимо изменить этот атрибут через функцию 43H.

Функция 42H

Установить указатель чтения/записи (можно также узнать размер файла).

Вход: AH=42h

BX=описатель файла

CX:DX=смещение указателя: (CX * 65536) + DX

AL=0 переместить к началу файла + CX:DX

AL=1 переместить к текущей позиции + CX:DX

AL=2 переместить к концу файла — CX:DX

Выход: AX=код ошибки, если CF установлен

DX:AX=новая позиция указателя файла (если нет ошибки)

Описание: Перемещает логический указатель чтения/записи к нужному адресу, с которого начнется очередная операция чтения или записи. Вызов с AL=2, CX=0, DX=0 возвращает длину файла в DX:AX. DX здесь старшее значащее слово: действительная длина (DX * 65536) + AX.

Функция 3fH

Читать из файла/устройства.

Вход: AH=3fh

BX=описатель файла

DS:DX=адрес буфера для чтения данных

CX=число считываемых байт

Выход: AX=код ошибки, если CF установлен

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

Описание: CX байт данных считываются из файла или устройства с описателем, указанным в BX. Данные читаются с текущей позиции указателя чтения/записи файла и помещаются в буфер вызывающей программы, адресуемый через DS:DX.

Всегда необходимо сравнивать возвращаемое значение AX (число прочитанных байт) с CX (запрошенное число байт):

- если AX=CX, (и CF сброшен) — чтение было корректным без ошибок;

- если AX=0 — достигнут конец файла (EOF);

- если AX<CX (но ненулевой), то возможны два варианта: при чтении с устройства — входная строка имеет длину AX байт; при чтении из файла — в процессе чтения достигнут EOF.

Функция 40H

Писать в файл/устройство.

Вход: AH=40h

BX=описатель файла

DS:DX=адрес буфера, содержащего данные

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

Выход: AX=код ошибки, если CF установлен

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

Описание: CX байт данных записывается в файл или на устройство с описателем, заданным в BX. Данные берутся из буфера, адресуемого через DS:DX и записываются, начиная с текущей позиции указателя чтения/записи файла. Необходимо всегда сравнивать возвращаемое значение AX (число записанных байт) с CX (запрошенное число байт для записи): если AX=CX, запись была успешной; если AX < CX, встретилась ошибка (скорее всего, переполнение).

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

x x A D V S H R

R — только чтение (нельзя обновлять или удалять);

H — скрытый;

S — системный;

V — метка тома;

D — элемент подоглавления;

A — архивный;

x — не используются.

ASCIIZ строка, содержащая имя файла, имеет вид: «‘d:\путь\имя_файла’,0». Если диск и/или путь опущены, они принимаются по умолчанию. После вызова функции описатель файла должен быть сохранен для последующих операций. Количество описателей в системе регламентируется файлом CONFIG.SYS.

Приведенный ниже пример иллюстрирует процесс работы с файлом через описатели в ассемблерной программе.

MOV AH,3CH;Создание файла

MOV CX,0

LEA DX,BUF;DS:DX — адрес ASCIIZ строки с именем

INT 21H

JC NO_CREATE;Проверка флага переноса

...;Работа с файлом

NO_CREATE:

...

BUF DB ‘d:\Users\1.txt’,0

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: