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

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 ограничивает число одновременно открытых файлов, то

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

их.

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

________________________________________________________________

__________________________________________________________________________

page 60,132

TITLE HANREAD (EXE) Чтение записей, созданных в HANCREAT

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

STACKSG SEGMENT PARA STACK 'Stack'

DW 80 DUP(?)

STACKSG ENDS

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

DATASG SEGMENT PARA 'Data'

ENDCDE DB 00

HANDLE DW ?

Ioarea db 32 dup(' ')

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

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

READMSG DB '*** Read error ***', 0DH, 0AH

ROW DB 00

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 E100PEN ;Открыть файл,

; ; установить DTA

CMP ENDCDE,00 ;Ошибка открытия?

JNZ A90 ; да - завершить программу

A20LOOP:

CALL F10READ ;Чтение записи с диска

CMP ENDCDE,00 ;Ошибка чтения?

JNZ A90 ; да - выйти,

CALL G10DISP ; нет - выдать имя,

JMP A20LOOP ; и продолжить

A90: RET

BEGIN ENDP

; Открытие файла:

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

E100PEN PROC NEAR

MOV AH,3DH ;Функция открытия

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

LEA DX,PATHNAM

INT 21H

JC E20 ;Ошибка открытия?

MOV HANDLE,AX ; нет - сохранить

RET ; файловый номер

E20:

MOV ENDCDE,01 ; да - выдать

LEA DX,OPENMSG ; сообщение об ошибке

CALL X10ERR

RET

E100PEN ENDP

; Чтение дисковой записи:

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

F10READ PROC NEAR

MOV AX,3FH ;Функция чтения

MOV BX,HANDLE

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

LEA DX,IOAREA

INT 21H

JC F20 ;Ошибка при чтении?

CMP AX,00 ;Конец файла?

JE F30

CMP IOAREA,1AH ;Маркер конца файла (EOF)?

JE F30 ; да - выйти

RET

F20:

LEA DX,READMSG ; нет - выдать

CALL X10ERR ; сообщение об ошибке

F30:

MOV ENDCDE,01 ;Код завершения

F90: RET

F10READ ENDP

; Вывод имени на экран:

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

G10DISP PROC NEAR

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

MOV BX,01 ;Установить номер

MOV CX,32 ; и длину

LEA DX,IOAREA

INT 21H

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

JEA G90 ; да - обойти

INC ROW

RET

G90:

MOV AX,0601H

CALL Q10SCR ;Прокрутка (скроллинг)

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

RET

G10DISP ENDP

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

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

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

MOV BH,1EH ;Установить цвет

MOV CX,0000

MOV DXX,184FH ;Функция прокрутки

INT 10H

RET

Q10SCR ENDP

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

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

Q20CURS PROC NEAR

MOV AH,02 ;Функция установки курсора

MOV BH,00 ; курсор

MOV DH,ROW ; строка

MOV DL,00 ; столбец

INT 10H

RET

Q20CURS ENDP

; Вывод сообщения об ошибке:

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