Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

64, То байт 36 всегда содержит 00.

Помните, что числовые значения в словах и двойных словах записываются

в обратной последовательности байтов.

Блоку FCB предшествует необязательное семибайтовое расширение,

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

атрибутами. Для использования расширения необходимо закодировать в первом

байте шест.FF, во втором - атрибут файла, а в остальных пяти байтах

шест. нули.

ИСПОЛЬЗОВАНИЕ БЛОКА FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ

________________________________________________________________

Для ссылки на каждый дисковый файл программа должна содержать

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

диск требуют установки адреса блока FCB в регистре DX. Доступ к полям

блока FCB осуществляются по этому адресу с помощью регистровой пары DS:DX.

Для создания нового файла программа использует функцию шест.16 в

прерывании DOS INT 21H следующим образом:

MOV AH,16H ;Создание

LEA DX,FCBname ; дискового файла

Int 21h ;Вызов dos

DOS осуществляет поиск имени файла и тип файла, взятого из

соответствующих полей FCB, в оглавлении. Если элемент оглавления,

содержащий необходимое имя (и тип), будет найдено, то DOS очищает

найденный элемент для нового использования, если такой элемент не будет

найден, то DOS ищет свободный элемент. Затем операция устанавливает размер

файла в 0 и "открывает" файл. На этапе открытия происходит проверка

доступного дискового пространства, результат такой проверки

устанавливается в регистре AL:

00 На диске есть свободное пространство

FF На диске нет свободного пространства.

При открытии также устанавливается в блок FCB номер текущего блока -

0 И размер записей (по умолчанию) - 128 (шест.80) байтов. Прежде, чем

начать запись файла, можно заменить это значение по умолчанию на требуемый

размер записей.

Для определения выводной записи необходимо прежде обеспечить

начальный адрес этой записи в область передачи данных (DTA - disk trausfer

area). Так как блок FCB содержит размер записей, то в DTA не требуется

устанавливать ограничитель конца записи. Затем с помощью функции шест.1A

необходимо сообщить DOS адрес DTA. В любой момент времени может быть

активен только один DTA. В следующем примере инициализируется адрес DTA:

MOV AH,1AH ;Установка адреса

LEA DX,DTAname ; DTA

Int 21h ;Вызов dos

Если программа обрабатывает только один дисковой файл, то должна быть

только одна установка адреса DTA для всего выполнения. При обработке

нескольких файлов программа должна устанавливать соответствующий адрес DTA

непосредственно перед каждой операцией чтения или записи.

Для последовательной записи на диск существует функция шест.15:

MOV AH,15 ;Последовательная

LEA DX,FCBname ; запись

Int 21h ;Вызов dos

Операция записи использует информацию из блока FCB и адрес текущего

буфера DTA. Если длина записи равна размеру сектора, то запись заносится

на диск. В противном случае записи заполняют буфер по длине сектора и

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

составляет 128 байтов, то буфер заполняется четырьмя записями (4*128=512)

и затем буфер записывается в дисковой сектор.

После успешного занесения записи на диск DOS увеличивает в блоке FCB

размер файла на размер записи и текущий номер записи на 1. Когда номер

текущей записи достигает 128, происходит сброс этого значения в 0 и в FCB

увеличивается номер текущего блока на 1. Операция возвращает в регистре AL

следующие коды:

00 Успешная запись.

01 Диск полный.

02 В области DTA нет места для одной записи.

Когда запись файла завершена, можно, хотя и не всегда обязательно,

записать маркер конца файла (шест.1A). Для закрытия файла используется

функция шест.10:

MOV AH,10H ;Закрыть

LEA DX,FCBname ; файл

INT 21H ;Вызов DOS

Эта операция записывает на диск данные, которые еще остались в дисковом

буфере DOS и изменяет в соответствующем элементе оглавления, дату и размер

файла. В регистре AL возвращаются следующие значения:

00 Успешная запись.

FF Описание файла оказалось в неправильном элементе

оглавления (возможно в результате смены дискеты).

ПРОГРАММА: ИСПОЛЬЗОВАНИЕ FCB ДЛЯ СОЗДАНИЯ ФАЙЛА НА ДИСКЕ

________________________________________________________________

__________________________________________________________________________

page 60,132

TITLE FCBCREAT (EXE) Использование FCB для создания файла

;----------------------------------------------------------

STACKSG SEGMENT PARA STACK 'Stack'

DW 80 DUP(?)

STACKSG ENDS

;----------------------------------------------------------

DATASG SEGMENT PARA 'Data'

RECLEN EQU 32

NAMEPAR LABEL BYTE ;Список параметров:

MAXLEN DB RECLEN ; макс.длина имени

NAMELEN DB ? ; число введенных символов

NAMEDTA DB RECLEN DUP(' ') ; область передачи (DTA)

FCBREC LABEL BYTE ;FCB для дискового файла

FCBDRIV DB 04 ; дисковод D

FCBNAME DB 'NAMEFILE' ; имя файла

FCBEXT DB 'DAT' ; тип файла

FCBBLK DW 0000 ; номер текущего блока

FCBRCSZ DW ? ; размер логической записи

FCBFLSZ DD ? ; размер файла (DOS)

DW ? ; дата (DOS)

DT ? ; зарезервировано (DOS)

FCBSQRC DB 00 ; номер текущей записи

DD ? ; относительный номер

CRLF DB 13,10,'$'

ERRCDE DB 00

PROMPT DB 'Name? ','$'

ROW DB 01

OPNMSG DB '*** Open error ***', '$'

WRTMSG DB '*** Write error ***', '$'

DATASG ENDS

; ---------------------------------------------------------

CODESG SEGMENT PARA 'Code'

BEGIN PROC FAR

ASSUME CS:CODESG,DS:DATASG,SS:STACKSG,ES:DATASG

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DATASG

MOV DS,AX

MOV ES,AX

MOV AX,0600H

CALL Q10SCR ;Очистить экран

CALL Q20CURS ;Установить курсор

CALL C10OPEN ;Открыть, установить DTA

CMP ERRCDE,00 ;Есть место на диске?

JZ A20LOOP ; да - продолжить,

RET ; нет - вернуться в DOS

A20LOOP:

CALL D10PROC

CMP NAMELEN,00 ;Конец ввода?

JNE A20LOOP ; нет - продолжить,

CALL G10CLSE ; да - закрыть файл

RET ; и вернуться в DOS

BEGIN ENDP

; Открытие дискового файла:

; ------------------------

C10OPEN PROC NEAR

MOV AH,16H ;Функция создания файла

LEA DX,FCBREC

INT 21H

CMP AL,00 ;Есть место на диске?

JNZ C20 ; нет - ошибка

MOV FCBRCSZ,RECLEN ;Размер записи (EQU)

LEA DX,NAMEDTA ;Загрузить адрес DTA

MOV AH,1AH

INT 21AH

RET

C20:

LEA DX,OPNMSG ;Сообщение об ошибке

CALL X10ERR

RET

C10OPEN ENDP

; Ввод с клавиатуры:

; -----------------

D10PROC PROC NEAR

MOV AH,09 ;Функция вывода на экран

LEA DX,PROMPT ;Выдать запрос

INT 21H

MOV AH,0AH ;Функция ввода

LEA DX,NAMEPAR ;Ввести имя файла

INT 21H

CALL E10DISP ;Прокрутка на экране

CMP NAMELEN,00 ;Имя введено?

JNE D20 ; да - продолжить,

RET ; нет - выйти

D20:

MOV BH,00 ;Заменить символ Return

MOV BL,NAMELEN

MOV NAMEDTA[BX],' ' ;Записать пробел

CALL F10WRIT ;Вызвать

; подпрограмму записи

CLD

LEA DI,NAMEDTA ;Очистить

MOV CX,RECLEN / 2 ; поле

MOV AX,2020H ; имени

REP STOSW

RET ;Выйти

D10PROC ENDP

; Прокрутка и установка курсора:

; -----------------------------

E10DISP PROC NEAR

MOV AH,09 ;Функция вывода на экран

LEA DX,CRLF ;CR/LF