Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции.doc
Скачиваний:
67
Добавлен:
18.03.2015
Размер:
353.28 Кб
Скачать

11.3 Операции ввода-вывода на диск

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

Метод доступа к дисковой памяти, поддерживающий использование оглавления, "блокирование" и "разблокирование" записей, обеспечивается прерыванием DOS 21H. Более низкий уровень, обеспечивающий абсолютную адресацию дисковых секторов, также через DOS, выполняется посредством прерываний 25H и 26H. Самый низкий уровень обеспечивается прерыванием BIOS 13H, которое позволяет выполнить произвольную адресацию в дисковой памяти по номеру дорожки и сектора. Методы DOS осуществляют некоторую предварительную обработку до передачи управления в BIOS.

11.3.1 Запись файла на диск

11.3.1.1 Данные в формате asciiz

Для создания файла необходимо сообщить DOS адрес строки в формате ASCIIZ, содержащей идентификацию файла в виде номера дисковода, пути доступа и имени файла (все параметры необязательные) и строка должна завершаться шестнадцатеричным нулем, например:

PATHNM1 DB 'B:\TEST.ASM',0

PATHNM2 DB 'C:\UTILITY\NU.EXE',0

Обратная косая (или прямая косая) используются в качестве разделителя. Нулевой байт (zero) завершает строку (отсюда название ASCIIZ формата). Для прерываний, использующих в качестве параметра ASCIIZ строку, адрес этой строки загружается в регистр DX, например, командой LEA DX,PATHNM1.

11.3.1.2 Файловый номер

Операции создания и открытия файла требуют загрузки в регистр AX двухбайтового числа, представляющего собой файловый номер. Стандартные устройства не нуждающиеся в операции открытия и могут использовать непосредственно файловые номера: 0 - ввод, 1 - вывод, 2 - вывод сообщений об ошибках, 3 - внешнее устройство, 4 - принтер.

Для доступа к диску при создании или открытии файла используется ASCIIZ строка и функция 3Ch или 3Dh прерывания DOS INT21h . Успешная операция устанавливает флаг CF в 0 и помещает файловый номер в регистр AX. Этот номер необходимо сохранить в элементе данных DW и использовать его для всех последующих операций над дисковым файлом. При неуспешной операции флаг CF устанавливается в 1, а в регистр AX помещается код ошибки, зависящий от операции.

11.3.1.3 Создание дискового файла

Для создания нового файла или переписывания старого файла используется функция 3Ch. При этом регистр DX должен содержать адрес ASCIIZ-строки, а регистр CX - необходимый атрибут; для обычного файла значение атрибута - 0.

Рассмотрим пример создания обычного файла:

MOV AH,3CH ; Запрос на создание

MOV CX,00 ; обычного файла

LEA DX,PATHNM1 ; ASCIIZ строка

INT 21H ; Вызов DOS

JC error ; Переход по ошибке

MOV HANDLE1,AX ; Сохранение файлового номера в DW

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

В случае возникновения ошибки операция устанавливает флаг CF в 1 и помещает в регистр AX код возврата: 03, 04 или 05. Код 05 свидетельствует либо о переполнении оглавления, либо о защите существующего файла атрибутом "только чтение". При завершении операции необходимо сначала проверить флаг CF, так как при создании файла возможна установка в регистре AX файлового номера 0005, который можно легко спутать с кодом ошибки 05 (нет доступа).

Для записи файла используется функция 40h. При этом в регистре BX должен быть установлен файловый номер, в регистре CX - число записываемых байт, а в регистре DX - адрес области вывода. В следующем примере происходит запись 256 байт из области OUTREC:

HANDLE1 DW ?

OUTREC DB 256 DUP (' ')

MOV AH,40H ; Запрос записи

MOV BX,HANDLE1 ; Файловый номер

MOV CX,256 ; Длина записи

LEA DX,OUTREC ; Адрес области вывода

INT 21H ; Вызов DOS

JC error2 ; Проверка на ошибку

CMP AX,256 ; Все байты записаны?

JNE error3

Правильная операция записывает из памяти на диск все данные (256 байт), очищает флаг CF и устанавливает в регистре AX число действительно записанных байтов. Если диск переполнен, то число записанных байтов может отличаться от заданного числа. В случае неправильной операции флаг CF устанавливается в 1, а в регистр AX заносится код 05 (нет доступа) или 06 (ошибка файлового номера).

После завершения записи файла необходимо установить файловый номер в регистр BX и, используя функцию 3Eh, закрыть файл. Эта операция записывает все оставшиеся еще данные из буфера на диск и корректирует оглавление и таблицу FAT.

MOV AH,3EH ; Запрос на закрытие файла

MOV BX,HANDLE1 ; Файловый номер

INT 21H ; Вызов DOS

В случае ошибки в регистре AX устанавливается код 06 (неправильный файловый номер).

      1. Чтение дискового файла

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

Эта операция проверяет правильность имени файла и его наличие на диске. При открытии регистр DX должен содержать адрес необходимой ASCIIZ-строки, а регистр AL - код доступа:

0 Открыть файл только для ввода

1 Открыть файл только для вывода

2 Открыть файл для ввода и вывода

Обратите внимание, что для записи файла используется функция создания (3Ch), но не функция открытия файла.

Ниже приведен пример открытия файла для чтения:

MOV AH,3DH ; Запрос на открытие

MOV AL,00 ; Только чтение

LEA DX,PATHNM1 ; Строка в формате ASCIIZ

INT 21H ; Вызов DOS

JC error4 ; Выход по ошибке

MOV HANDLE2,AX ; Сохранение номера в DW

Если файл с необходимым именем существует, то открытия устанавливает длину записи равной 1, принимает существующий атрибут, сбрасывает флаг CF и заносит файловый номер в регистр AX. Файловый номер используется в дальнейшем для всех последующих операций.

Если файл отсутствует, то операция устанавливает флаг CF и заносит в регистр AX код ошибки. Не забывайте проверять флаг CF. При успешном создании файла система может установить в регистре AX файловый номер 0005, что легко можно спутать с кодом ошибки 05 (нет доступа).

Для чтения записей файла используется функция 3Fh. При этом необходимо установить в регистре BX файловый номер, в регистре CX - число байтов и в регистре DX - адрес области ввода. В следующем примере происходит считывание 512-байтовой записи:

HANDLE2 DW ?

INPREC DB 512 DUP (' ')

MOV AH,3FH ; Запрос на чтение

MOV BX,HANDLE2 ; Файловый номер

MOV CX,512 ; Длина записи

LEA DX,INPREC ; Адрес области ввода

INT 21H ; Вызов DOS

JC error5 ; Проверка на ошибку

CMP AX,00 ; Прочитано 0 байтов?

JE endfile

Правильно выполненная операция считывает запись в память, сбрасывает флаг CF и устанавливает в регистре AX действительно прочитанных байтов. Нулевое значение в регистре AX обозначает попытку чтения после конца файла. Ошибочная операция устанавливает флаг CF и возвращает в регистре AX код ошибки 05 (нет доступа) или 06 (ошибка файлового номера).

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]