Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

epd629

.pdf
Скачиваний:
17
Добавлен:
02.05.2015
Размер:
1.05 Mб
Скачать

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

После успешной операции чтения в блоке FCB автоматически увеличивается номер текущей записи на 1. Завершение последовательного чтения определяется программой по маркеру конца файла (EOF), для чего в программе имеется соответствующая проверка. Так как оглавление при чтении файла не изменяется, то обычно нет необходимости закрывать файл после завершения чтения. Исключение составляют программы, которые открывают и читают несколько файлов одновременно. Такие программы должны закрывать файлы, так как DOS ограничивает число одновременно открытых файлов.

4.5. Прямой доступ

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

В некоторых случаях применяется доступ к конкретным записям файла для получения информации, например, о нескольких служащих или о части ассортимента товаров. Для доступа, скажем, к 300-й записи файла при произвольном доступе не требуется чтение всех 299 предшествующих записей, а при последовательной обработке требуется.

Примечание. Файл создается последовательно, а доступ к записям может быть последовательным или прямым (произвольным). Требования прямой обработки, использующей вызов DOS, заключаются в установке требуемого номера записи в соответствующее поле FCB и выдаче команды прямого чтения или записи.

Произвольный доступ использует относительный номер записи (байты 33 36) в блоке FCB. Поле имеет размер двойного слова и использует обратную последовательность байтов в словах.

Для локализации требуемой записи система автоматически преобразует относительный номер записи в номер текущего блока (байты 12 13) и номер текущей записи (байт 32).

31

4.6. Прямое чтение

Операции открытия и установки DTA одинаковы как для прямой, так и для последовательной обработки. Предположим, что программа должна выполнить прямой доступ к пятой записи файла. Установим значение 05 в поле FCB для относительного номера записи и выполним команды для прямого чтения. В результате успешной операции содержимое пятой записи будет помещено в

DTA.

Для прямого чтения записи необходимо поместить требуемое значение относительного номера записи в FCBи вызвать функцию21h:

mov ah,21h

; запрос на

lea dx,FCBname

; прямое чтение

int 21h

; вызов DOS

Операция чтения преобразует относительный номер записи в номера текущего блока и записи. Полученные значения используются для локализации требуемой дисковой записи, передачи содержимого записи в DTA и установки в регистр al следующих значений:

 

Таблица 4.7

 

 

al

Результат проверки

00

Успешное завершение

01

Данные не доступны

02

Чтение прекращено из-за нехватки места в DTA

03

Прочитана частичная запись, заполненная нулями

Как видно, среди перечисленных кодов возврата отсутствует состояние “конец файла”. При корректном чтении записи предполагается единственный код возврата 00. Остальные коды возврата могут являться результатом установки неправильного относительного номера записи или некорректной установки адреса DTA или FCB. Так как такие ошибки легко допустить, то полезно выполнять проверку регистра al на ненулевое значение.

4.7. Прямая запись

Программа может, используя прямой доступ, считать необходимую запись, внести изменения и вернуть запись на диск на то же место. Операция прямой записи использует относительный номер записи в блоке FCB и функцию 22h следующим образом:

mov ah,22h

; запрос на

lea dx,FCBname

; прямую запись

 

32

int 21h

; вызов DOS

Операция устанавливает в регистре al следующие коды возврата:

 

Таблица 4.8

al

Результат проверки

00

Успешная операция

01

На диске нет места

02

Операция прекращена, т.к. недостаточно места в DTA

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

Как уже отмечалось (см. подраздел 4.5), используемый при прямом доступе относительный номер записи в блоке FCB имеет размер двойного слова (четыре байта); каждое слово в нем записывается в обратной последовательности байтов. Для небольших файлов, возможно, потребуется установка лишь самого левого байта или слова, но для больших файлов установка номера записи в трех или четырех байтах требует некоторой тщательности.

4.8. Прямой блочный доступ

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

Начать можно с любого правильного относительного номера записи. Число записей также может быть любым, хотя блок должен находиться в пределах файла. Перед началом необходимо открыть файл и инициализировать DTA.

Для операции прямой блочной записи необходимо установить в регистре cx требуемое число записей, установить в FCB стартовый относительный номер записи и выдать функцию 28h:

mov

ah,28h

; операция прямой блочной записи

mov

cx,records

; установка числа записей

lea dx,FCBname

 

int 21h

; вызов DOS

Операция преобразует относительный номер записи (байты 33 36) в номер текущего блока (байты 12 13) и текущий номер записи (байт 32). Полученные значения используются для определения

33

начального адреса на диске. В результате операции в регистре al устанавливаются следующие коды возврата:

 

Таблица 4.9

al

Значение кода возврата

00

Успешное завершение для всех записей

01

На диске недостаточно места

Кроме того, операция устанавливает в FCB в поле относительного номера записи и в полях текущих номеров блока и записи значения, соответствующие следующему номеру записи. Например, если были записаны записи с 00 до 24, то следующий номер записи будет 25 (19h).

Для операции прямого блочного чтения необходимо установить в регистре cx требуемое число записей и использовать функцию 27h:

mov

ah,27h

; операция прямого блочного чтения

mov

cx,records

; установка числа записей

lea dx,FCBname

 

int 21h

; вызов DOS

Операция чтения возвращает в регистре al следующие значения:

 

Таблица 4.10

 

 

al

Значение кода возврата

00

Успешное чтение всех записей

01

Прочитана последняя запись файла

02

Прочитано предельное для DTA число записей

03

Прочитана последняя запись файла не полностью

В регистре cx остается действительное число прочитанных записей, а в FCB в поле относительного номера записи и в полях текущих номеров блока и записи устанавливаются значения, соответствующие следующему номеру записи.

Если необходимо загрузить в память весь файл, но число записей неизвестно, то следует после операции открытия разделить размер файла на длину записи. Например, для размера файла 320h (800) и длины записи 20h (32) число записей будет 19h (25).

4.9. Абсолютные операции дискового ввода-вывода

Для непосредственного доступа к диску можно использовать операции абсолютного чтения и абсолютной записи с помощью функций DOS int 25h и 26h. В этом случае не используются

34

оглавление диска и преимущества блокирования и разблокирования записей, обеспечиваемые функцией DOS int 21h.

Абсолютные операции предполагают, что все записи имеют размер сектора, поэтому прямой доступ осуществляется к полному сектору или блоку секторов. Адресация диска выполняется по "логическому номеру записи" (абсолютный сектор). Для определения логического номера записи на двухсторонних дискетах с девятью секторами счет секторов ведется с дорожки 0 сектора 1 следующим образом:

 

 

 

 

 

Таблица 4.11

 

 

 

 

 

 

Дорожка

Сектор

Логический

Дорожка

Сектор

Логический

 

 

номер

 

 

номер

 

 

записи

 

 

записи

0

1

0

1

4

12

0

2

1

1

. . .

 

0

3

2

1

9

17

0

. . .

 

2

1

18

0

9

8

2

2

19

1

1

9

2

. . .

 

1

2

10

2

9

26

1

3

11

 

. . .

 

Фрагмент программы для абсолютных операций ввода-вывода:

mov

al,drive#

; 0 для A, 1 для B и т.д.

mov bx,addr

; адрес области ввода-вывода

mov

cx,sectors

; число секторов

mov dx,record#

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

int 25h или 26h

; абсолютное чтение или запись

Операции абсолютного чтения или запись разрушают содержимое всех регистров, кроме сегментных, и устанавливают флаг cf для индикации успешной (0) или безуспешной (1) операции. В случае безуспешной операции содержимое регистра al описывает характер ошибки:

Таблица 4.12

al

Причина

1000 0000

Устройство не отвечает

0100 0000

Ошибка установки головок

0010 0000

Ошибка контролера

0001 0000

Ошибка дискеты?

0000 1000

Переполнение DMA при чтении

0000 0100

Сектор не найден

0000 0011

Попытка записи на защищенной дискете

 

35

0000 0010 Не найден адресный маркер

Команда int записывает содержимое флагового регистра в стек. После завершения команды int следует восстановить флаги, но проверив перед этим флаг cf.

4.10. Другие операции

Кроме основных дисковых функций DOS имеется несколько дополнительных полезных дисковых операций.

4.11. Сброс диска

Обычно нормальное закрытие файла приводит к занесению всех оставшихся в буфере записей на диск и корректировке оглавления. В особых случаях (например, при аварийном завершении) может потребоваться сброс диска. Функция DOS 0dh освобождает все файловые буферы и не корректирует оглавление диска. Если необходимо, то вначале данная функция закрывает все файлы.

mov ah,0dh

; запрос на сброс диска

int 21h

; вызов DOS

 

4.12. Установка текущего дисковода

Основное назначение функции DOS 0eh установка номера текущего (по умолчанию) дисковода. Номер дисковода помещается в регистр dl, причем 0 соответствует дисководу A, 1 B и т.д.

mov

ah,0eh

; запрос на установку

mov

dl,02

; дисковода C

int 21h

; вызов DOS

Операция возвращает в регистр al число дисководов (независимо от типа). Так как для DOS необходимо, по крайней мере, два логических дисковода (A и B), то DOS возвращает значение 02 и для систем с одним дисководом. Для определения действительного числа дисководов используется команда int 11h.

4.13. Поиск элементов оглавления

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

36

необходимо загрузить в регистр dx адрес неоткрытого блока FCB и выполнить функцию 11h. При использовании расширенного блока FCB можно также получить код атрибута:

mov ah,11h

; запрос на первый элемент

lea dx,FCBname

; неоткрытый FCB

int 21h

; вызов DOS

В регистре al операция возвращает следующие значения:

 

Таблица 4.13

al

Значение кода возврата

00

Элемент найден

FF

Элемент не найден

Операция устанавливает в DTA номер дисковода (1=A, 2=B и т.д.), имя файла и тип файла. Если найдено несколько элементов при выборке по шаблону (например, *.asm), то для локализации элементов подмножества директории используется функция 12h:

mov ah,12h

; запрос следующего элемента

lea dx,FCBname

; неоткрытый FCB

int 21h

; вызов DOS

Коды возврата в регистре al аналогичны кодам функции 11h.

4.14. Удаление файла

Для удаления файла в программе используется функция 13h. Операция удаления устанавливает специальный байт в первой позиции имени файла в оглавлении.

mov ah,13h

; запрос на удаление файла

lea dx,FCBname

; неоткрытый FCB

int 21h

; вызов DOS

Если операция находит и удаляет элемент, то в регистре al устанавливается код возврата 00, иначе код равен шестнадцатеричному FF.

4.15. Переименование файла

Для переименования файла в программе старое имя файла записывается в обычном месте блока FCB, а новое начиная со смещения 16.

mov ah,17h

; запрос на переименование

lea dx,FCBname

; адрес FCB

int 21h

; вызов DOS

 

37

Символы ? и * в новом имени приводят к сохранению в соответствующих позициях символов из старого имени. Успешная операция устанавливает в регистре al код возврата 00, а безуспешная (файл по старому имени не найден или по новому имени уже существует) код FF.

4.16. Получение текущего номера дисковода

Функция 19h позволяет определить текущий номер дисковода:

mov ah,19h

; получить текущий дисковод

int 21h

; вызов DOS

Операция возвращает шестнадцатеричный номер дисковода в регистре al (0=A, 1=B и т.д.). Полученное значение можно поместить непосредственно в FCB для доступа к файлу с текущего дисковода.

Кроме перечисленных существуют функции для получения информации из таблицы FAT (1B и 10), установки поля прямой записи (24), установки вектора прерываний (25), создания нового программного сегмента (26) и анализа имени файла (29). Эти функции описаны в техническом руководстве по DOS.

Контрольные вопросы

1.Общие сведенья о работе с файлами.

2.Назначение блока управления файлом (FCB).

3.Как осуществляется создание, запись и закрытие файла.

4.Как осуществляется открытие, запись и закрытие файла.

5.Как осуществляется открытие, чтение и закрытие файла.

6.Какие значения принимают по умолчанию номер текущего блока и размер записей при открытии файла?

7.Назначение области DTA? Как инициализируется адрес DTA?

8.Как инициализируется адрес DTA при обработке нескольких файлов (например, чтение из двух файлов, побайтное суммирование и запись полученных сумм в третий файл)?

9.Последовательное чтение дискового файла. Замена длины записи.

10.Прямой доступ к дисковому файлу. Относительный номер

записи.

11.Прямое чтение записей дискового файла. Использование относительного номера записи.

12.Прямая запись в дисковый файл. Использование относительного номера записи.

38

13.Прямой блочный доступ: прямая блочная запись, задание количества записей, стартовый относительный номер записи. Как используются номер текущего блока и текущий номер записи?

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

15.Абсолютные операции дискового ввода-вывода. Длина записи при выполнении операций абсолютного чтения и абсолютной записи

спомощью функций DOS.

16.Сброс диска. В каких случаях осуществляется, и что при этом выполняется. Получение текущего номера дисковода.

17.Установка текущего дисковода. Удаление файла.

18.Напишите функции базовой версии DOS для следующих операций:

а) создание файла; б) установка DTA;

в) последовательная запись; г) открытие файла; д) последовательное чтение.

19.Программа использует размер записи, устанавливаемый при открытии файла по умолчанию.

а) сколько записей содержит один сектор?

б) сколько записей содержит дискета с тремя дорожками по девять секторов на каждой?

в) если на дискете (б) находится один файл, то при последовательном чтении сколько произойдет физических обращений к диску?

20.Определите текущий блок и запись для следующих номеров записей при прямом доступе: а) 45, б) 73, в) 150, г) 260.

21.В каком виде номер записи 2652 (десятичное) устанавливается в поле относительной записи блока FCB?

22.Укажите шестнадцатеричные номера функций для следующих операций:

а) прямая запись, б) прямое чтение,

в) прямая блочная запись, г) прямое блочное чтение.

23.Напишите команды для определения числа записей файла, предполагая, что операция открытия уже выполнена.

Имена полей с размером файла fcbflsz и размером записи fcbfcsz.

39

24.Составьте блок-схему программы, которая вводит данные с клавиатуры и записывает эти данные на диск в двоичном формате.

25.Составьте блок-схему программы, которая использует операцию прямого чтения с диска данных в двоичном формате и вывод их на экран.

40

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