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

Int 21h ;Вызов dos

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

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

При правильном открытии операция создает элемент оглавления с данным

атрибутом, очищает флаг CF и устанавливает файловый номер в регистре AX.

Этот номер должен использоваться для всех последующих операций. Если

создаваемый файл уже существует (т.е. имя файла присутствует в

оглавлении), то длина этого файла устанавливается в 0 для перезаписи.

В случае возникновения ошибки операция устанавливает флаг CF в 1 и

помещает в регистр AX код возврата: 03, 04 или 05 (см.табл.17.1). Код 05

свидетельствует либо о переполнении оглавления, либо о защите

существующего файла атрибутом "только чтение". При завершении операции

необходимо сначала проверить флаг CF, так как при создании файла возможна

установка в регистре AX файлового номера 0005, который можно легко спутать

с кодом ошибки 05 (нет доступа).

Запись файла: шест.40

-----------------------

Для записи файла используется функция DOS шест.40. При этом в

регистре 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

(ошибка файлового номера).

Закрытие файла: шест.3E

--------------------------

После завершения записи файла необходимо установить файловый номер в

регистр BX и, используя функцию DOS шест.3E, закрыть файл. Эта операция

записывает все оставшиеся еще данные из буфера на диск и корректирует

оглавление и таблицу FAT.

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

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

Int 21h ;Вызов dos

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

файловый номер).

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

________________________________________________________________

__________________________________________________________________________

page 60,132

TTILE HANCREAT (EXE) Создание файла на диске

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

STACKSG SEGMENT PARA STACK 'Stack'

DW 80 DUP(?)

STACKSG ENDS

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

DATASG SEGMENT PARA 'Data'

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

MAXLEN DB 30 ;

NAMELEN DB ? ;

NAMEREC DB 30 DUP(' '), 0DH, 0AH ; введенное имя, CR/LF для записи

ERRCDE DB 00

HANDLE DW ?

PATHNAM DB 'D:\NAMEFILE.DAT',0

PROMPT DB 'Name? '

ROW DB 01

OPNMSG DB '*** Open error ***', 0DH, 0AH

WRTMSG DB '*** Write error ***', 0DH, 0AH

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 C10CREA ;Создание файла, установка DTA

CMP ERRCDE,00 ;Ошибка при создании?

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

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

A20LOOP:

CALL D10PROC

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

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

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

RET ; и выйти в DOS

BEGIN ENDP

; Создание файла на диске:

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

C10CREA PROC NEAR

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

MOV CX,00 ;Нормальный атрибут

LEA CX,PATHNAM

INT 21H

JC C20 ;Есть ошибка?

MOV HANDLE,AX ; нет - запомнить номер,

RET

C20: ; да -

LEA DX,OPNMSG ; выдать сообщение

CALL X10ERR ; об ошибке

RET

C10CREA ENDP

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

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

D10PROC PROC NEAR

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

MOV BX,01 ;Номер (Handle)

MOV CX,06 ;Длина текста запроса

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

INT 21H

MOV AH,0AH ;Функция ввода с клавиатуры

LEA DX,NAMEPAR ;Список параметров

INT 21H

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

JNE D20 ; да - обойти

RET ; нет - выйти

D20:

MOV AL,20H ;Пробел для заполнения

SUB CH,CH

MOV CL,NAMELEN ;Длина

LEA DI,NAMEREC ;

ADD DI,CX ;Адрес + длина

NEG CX ;Вычислить

ADD CX,30 ; оставшуюся длину

REP STOSB ;Заполнить пробелом

D90:

CALL F10WRIT ;Запись на диск

CALL E10SCRL ;Проверка на скроллинг

RET

D10PROC ENDP

; Проверка на скроллинг:

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

E10SCRL PROC NEAR

CMP ROW,18 ;Последняя строка экрана

JAE E10 ; да - обойти,

INC ROW ; нет - увеличить строку

JMP E10

E10:

MOV AX,0601H ;Продвинуть на одну строку

CALL Q10SCR

E90: CALL Q20CURS ;Установка курсора

RET

E10SCRL ENDP

; Запись на диск:

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

F10WRIT PROC NEAR

MOV AH,40H ;Функция записи на диск

MOV BX,HANDLE

MOV CX,32 ;30 для имени + 2 для CR/LF

LEA DX,NAMEREC

INT 21H

JNC F20 ;Ошибка записи?

LEA DX,WRTMSG ; да -

CALL X10ERR ; выдать предупреждение

MOV NAMELEN,00

F20:

RET

F10WRIT ENDP

; Закрытие файла на диске:

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

G10CLSE PROC NEAR

MOV NAMEREC,1AH ;Маркер конца записи (EOF)

CALL F10WRIT

MOV AH,3EH ;Функция закрытия

MOV BX,HANDLE

INT 21H

RET

G10CLSE ENDP

; Прокрутка (скроллинг) экрана:

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

Q10SCR PROC NEAR ;в AX - адрес элемента

MOV BH,1EH ;Цвет - желтый на синем

MOV CX,0000

MOV DX,184FH