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

Ianet Brown

David Christie

...

Программа подсчитывает число напечатанных строк и при достижении

конца страницы выполняет прогон до начала следующей страницы. В программе

имеются процедуры:

D10INPT Выдает на экран запрос и затем вводит имя с клавиатуры.

E10PRNT Выводит имя на печатающее устройство (длина имени берется из

вводного списка параметров); в конце страницы вызывает процедуру

M10PAGE.

M10PAGE Выполняет прогон на новую страницу, печатает заголовок,

сбрасывает счетчик строк и увеличивает счетчик страниц на

единицу.

P100UT Общая подпрограмма для непосредственного вывода на печатающее

устройство.

В начале выполнения необходимо напечатать заголовок, но не делать

перед этим перевод страницы. Поэтому процедура M10PAGE обходит перевод

страницы, если счетчик PAGECTR содержит 01 (начальное значение). Поле

PAGECTR определено как

PAGECTR DB '01'

В начале выполнения необходимо напечатать заголовок, но не делать

перед этим перевод страницы. Поэтому процедура M10PAGE обходит перевод

страницы, если счетчик PAGECTR содержит 01 (начальное значение). Поле

PAGECTR определено как

PAGECTR DB '01'

В результате будет сгенерировано число в ASCII-коде - шест.3031. Процедура

M10PAGE увеличивает счетчик PAGECTR на 1 так, что значение становится

последовательно 3032, 3033 и т.д. Эти значения корректны до 3039, далее

следует 303A, что будет распечатано, как двоеточие (:). Поэтому, если в

правом байте поля PAGECTR появляется шест.3A, то это значение заменяется

на шест.30, а к левому байту прибавляется единица. Таким образом шест.303A

перекодируется в шест.3130, т.е. в 10 в символьном представлении.

Проверка на конец страницы до (но не после) печати имени гарантирует,

что на последней странице будет напечатано по крайней мере одно имя под

заголовком.

ПЕЧАТЬ ASCII-ФАЙЛОВ И ТАБУЛЯЦИЯ

________________________________________________________________

Табуляция, обеспечиваемая, например, видеоадаптерами, заключается в

замене одного символа табуляции (код 09) несколькими пробелами при выводе

так, чтобы следующая позиция была кратна 8. Таким образом, стандартные

позиции табуляции являются 8, 16, 24 и т.д. Многие принтеры, однако,

игнорируют символы табуляции. Поэтому, такая программа, как DOS PRINT,

предназначенная для печати ASCII файлов (например ассемблерных исходных

текстов) проверяет каждый символ, посылаемый на принтер. И, если

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

позиции кратной 8.

Программа, приведенная на рис.19.2, выводит на экран запрос на ввод

имени файла и, затем, печатает содержимое указанного файла. Эта программа

в отличие от приведенной на рис.17.3 (вывод файлов на экран) осуществляет

замену выводимых символов табуляции на соответствующее число пробелов. В

результате символ табуляции в позициях от 0 до 7 приводит к переходу на

позицию 8, от 8 до 15 - на 16 и т.д. Команды, реализующие данную логику,

находятся в процедуре G10XFER после метки G60. Рассмотрим три примера

обработки символа табуляции:

Текущая позиция печати: 1 9 21

Двоичное значение: 00000001 00001001 00010101

Очистка трех правых битов: 00000000 00001000 00010000

Прибавление 8: 00001000 00010000 00011000

Новая позиция: 8 16 24

В программе организованы следующие процедуры:

С10PRMP Запрашивает ввод имени файла. Нажатие только клавиши Return

приводит к завершению работы программы.

E10OPEN Открывает дисковый файл по указанному имени.

G10XFER Контролирует конец сектора, конец файла, конец области вывода,

символы "перевод строки" и табуляции. Пересылает обычные символы

в область вывода.

P10PRNT Распечатывает выводную строку и очищает область вывода.

R10READ Считывает сектор из дискового файла.

Коды "возврат каретки", "перевод строки" и "прогон страницы"

действительны для любых принтеров. Можно модифицировать программу для

подсчета распечатываемых строк и выполнения прогона страницы (шест.OC) при

достижении, например, строки 62.

Некоторые пользователи предпочитают устанавливать символы "прогон

страницы" в ASCII файлах с помощью текстового редактора в конкретных

местах текста, например, в конце ассемблерных процедур. Кроме того, можно

изменить программу для функции 05 базовой версии DOS. Эта функция

выполняет вывод каждого символа непосредственно на принтер. Таким образом

можно исключить определение и использование области вывода.

__________________________________________________________________________

TITLE PRINASK (COM) Чтение и печать дисковых записей

CODESG SEGMENT PARA 'Code'

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

ORG 100H

BEGIN JMP MAIN

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

PATHPAR LABEL BYTE ;Список параметров для

MAXLEN DB 32 ; ввода

NAMELEN DB ? ; имени файла

FILENAM DB 32 DUP(' ')

SECTOR DB 512 DUP(' ') ;Область ввода для файла

DISAREA DB 120 DUP(' ') ;Область вывода

COUNT DW 00

ENDCDE DW 00

FFEED DB 0CH

HANDLE DW 0

OPENMSG DB '*** Open error ***'

PROMPT DB 'Name of file? '

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

MAIN PROC NEAR ;Основная программа

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

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

A10LOOP:

MOV ENDCDE,00 ;Начальная установка

CALL C10PRMP ;Получить имя файла

CMP NAMELEN,00 ;Есть запрос?

JE A90 ; нет - выйти

CALL E10OPEN ;Открыть файл,

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

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

JNE A80 ; да - повторить запрос

CALL R10READ ;Прочитать первый сектор

CMP ENDCDE,00 ;Конец файла, нет данных?

JE A80 ; да - повторить запрос

CALL G10XPER ;Распечатать сектор

A80:

JMP A10LOOP

A90: RET

MAIN ENDP

; Подпрограмма запроса имени файла:

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

C10PRMP PROC NEAR

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

MOV BX,01

MOV CX,13

LEA DX,PROMPT

INT 21H

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

LEA DX,PATHPAR

INT 21H

MOV BL,NAMELEN ;Записать

MOV BH,00 ; 00 в конец

MOV FILENAM[BX],0 ; имени файла

C90 RET

C10PRMP ENDP

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

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

E10OPEN PROC NEAR

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

MOV AL,00 ;Только чтение

LEA DX,FILENAM

INT 21H

JNC E20 ;Проверить флаг CF

CALL X10ERR ; ошибка, если установлен

RET

E20:

MOV HANDLE,AX ;Сохранить номер файла

MOV AX,2020H

MOV CX,256 ;Очистить пробелами

REP STOSW ; область сектора

RET

E100PEN ENDP

; Подготовка и печать данных:

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

G10XFER PROC NEAR

CLD ;Направление слева-направо

LEA SI,SECTOR ;Начальная установка

G20:

LEA DI,DISAREA

MOV COUNT,00

G30:

LEA DX,SECTOR+512

CMP SI,DX ;Конец сектора?

JNE G40

CALL R10READ ; да - читать следующий

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

JE G80 ; да - выйти

LEA SI,SECTOR

G40:

MOV BX,COUNT

CMP BX,80 ;Конец области вывода?

JB G50 ; нет - обойти

MOV [DI+BX],0D0AH ; да - записать CR/LF

CALL P10PRNT

LEA DI,DISAREA ;Начало области вывода

G50:

LODSB ;Записать [SI] в AL,

; увеличить SI

MOV BX,COUNT

MOV [DI+BX],AL ;Записать символ

INC BX

CMP AL,1AH ;Конец файла?

JE G80 ; да - выйти

CMP AL,0AH ;Конец строки?

JNE G60 ; нет - обойти,

CALL P10PRNT ; да - печатать

JMP G20

G60:

CMP AL,09H ;Символ табуляции?

JNE G70

DEC BX ; да - установить BX:

MOV BYTE PTR [DI+BX],20H ;Заменит TAB на пробел

AND BX,0FFF8H ;Обнулить правые 8 бит

ADD BX,08 ; и прибавить 8

G70:

MOV COUNT,BX

JMP G30

G80: MOV BX,COUNT ;Конец файла

MOV BYTE PTR [DI+BX],0CH ;Прогон страницы

CALL P10PRNT ;Печатать последнюю строку

G90: RET

G10XFER ENDP

; Подпрограммы печати:

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

P10PRNT PROC NEAR

MOV AH,40H ;Функция печати

MOV BX,04

MOV CX,COUNT ;Длина

INC CX

LEA DX,DISAREA

INT 21H

MOV AX,2020H ;Очистить область вывода

MOV CX,60

LEA DI,DISAREA

REP STOSW

RET

P10PRNT ENDP

; Подпрограмма чтения сектора:

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

R10READ PROC NEAR

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

MOV BX,HANDLE ;Номер файла

MOV CX,512 ;Длина

MOV DX,SECTOR ;Буфер

INT 21H

MOV ENDCDE,AX

RET

R10READ ENDP

; Прокрутка экрана:

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

Q10SCR PROC NEAR

MOV AX,0600H

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

MOV CX,0000 ;Прокрутка (сскроллинг)

MOV DX,184FH

INT 10H

RET

Q10SCR ENDP

; Подпрограмма установки курсора:

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

Q20CURS PROC NEAR

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

MOV BH,00 ; курсора

MOV DX,00

INT 10H

RET

Q20CURS ENDP

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

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