Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответики.docx
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
74.6 Кб
Скачать
  1. Операции ввода-вывода на диск

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

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

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

Данные в формате ASCIIZ

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

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

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

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

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

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

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

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

Для создания нового файла или переписывания старого файла используется функция 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 (неправильный файловый номер).

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

Если в программе требуется прочитать дисковый файл, то прежде необходимо открыть его, используя функцию 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 ограничивает число одновременно открытых файлов, то программа, успешно отработавшая с несколькими файлами, должна закрывать их.

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