Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Вывод на экран одного символа. Часть 2
ОГЛАВЛЕНИЕ
Средний уровень.
Операционная система предоставляет шесть процедур вывода на
экран - три в BIOS и три в DOS. Они отличаются главным образом
тем, передвигается курсор или нет, после вывода символа, вызывают
ли они сдвиг экрана, позволяют ли они устанавливать атрибуты и
цвета символов, а также какие управляющие коды они интерпретируют
(некоторые рассматривают символ BackSpace, просто как обычный
символ, а некоторые действительно сдвигают курсор на одну позицию
назад). Эти шесть процедур следующие:
Прерывание 10H:
функция 9 вывод символа с атрибутами
A вывод символа без атрибутов
E "телетайпная" процедура (как на принтер)
Прерывание 21H:
функция 2 вывод символа без атрибутов
6 вывод символа без атрибутов
9 вывод строки символов
Функции 9 и A прерывания 10H вообще не интерпретируют управ-
ляющие символы. Функции DOS интерпретируют управляющие коды,
приведенные в следующей таблице. Функция E прерывания 10H интерп-
ретирует все коды таблицы, кроме ASCII 9.
ASCII 7 звонок
ASCII 8 возврат на шаг (BackSpace)
ASCII 9 табуляция
ASCII 10 перевод строки
ASCII 13 возврат каретки
Первые две функции прерывания 10H не передвигают курсор после
вывода символа. Функция 9 этого прерывания выводит на экран с
указанием атрибутов, а функция A - без указания, при этом сохра-
няется текущее значение байта атрибутов для этого символа. AL
должен содержать выводимый символ, а BL - атрибуты. Номер страни-
цы дисплея содержится в BH. Он должен указываться даже для монох-
ромного дисплея, который имеет только одну страницу памяти дисп-
лея. В этом случае должна быть установлена первая страница, кото-
рой соответствует номер 0. Особое свойство этих двух функций BIOS
состоит в том, что символ выводится такое число раз, какое указа-
но в CX. Обычно указывают CX равным 1, но эти функции могут легко
выводить целые строки символов, если указать большее значение
счетчика - полезное свойство при создании рамок. Отметим, что
даже если выводится много символов, то позиция курсора не изме-
няется. Когда строка выводимых символов займет все свободное
пространство экрана справа-вниз от курсора, то вывод будет пере-
несен в первые позиции экрана.
;---вывод символа в негативе
MOV AH,9 ;функция записи с атрибутами
MOV AL,THE_CHARACTER ;символ в AL
MOV BL,112 ;атрибуты в BL
MOV BH,0 ;страница 1
MOV CX,1 ;вывести один раз
INT 10H
Вместо того, чтобы постоянно восстанавливать значение счетчика в
CX прерывание BIOS предоставляет также телетайпную процедуру,
которая больше подходит для вывода строки символов. Она выпол-
няется функцией E. Она готовится так же, как и функция A, но не
надо засылать значение в CX. Строка выводится просто за счет
изменения символа в AL и повторного вызова прерывания. При ис-
пользовании в графическом режиме в BL устанавливается цвет палет-
ты, в противном случае сохраняется старый атрибут.
;---вывод строки с помощью телетайпной процедуры
MOV AH,0EH ;номер функции
MOV BH,0 ;номер страницы
LEA BX,STRING ;BX указывает на строку
NEXT_CHAR: MOV AL,[BX] ;берем символ в AL
CMP AL,'$' ;проверка на конец строки
JE ALL_DONE ;если да, то выход
INT 10H ;вывод строки
INC BX ;переходим к следующему символу
JMP SHORT NEXT_CHAR ;повторяем процедуру
ALL_DONE:
Прерывание DOS 21H как правило предоставляет более полезные
процедуры, поскольку они перемещают курсор и приводят к сдвигу
экрана при достижении нижней строки, а также интерпретируют неко-
торые из обычных управляющих кодов. Функции DOS выводят на стра-
ницу, которая должна быть установлена функцией 5 прерывания 10H
[4.5.3]. Предоставляются две функции для вывода символа, с номе-
рами 2 и 6. Первая из них распознает Ctrl-Break [3.2.8], а вторая
- нет. (Когда с клавиатуры вводится Ctrl-Break, то процедура
обработки Ctrl-Break не выполняется до тех пор, пока не исполь-
зуется функция, которая распознает его наличие).
Обе функции выводят белые символы на черном фоне, до тех пор,
пока не сделана специальная установка цвета с помощью драйвера
устройства ANSI.SYS [4.1.3]. В общем необходимо только поместить
символ в DL, номер функции в AH и вызвать прерывание 21H. Однако
функция 6 особенная в том смысле, что она имеет второе назначение
в качестве функции ввода с клавиатуры. Она выступает в этой роли
только если в DL помещен код FF [3.1.5]. Во всех остальных слу-
чаях она выводит на экран содержимое DL. В следующем примере
функция 6 поочередно принимает и печатает символ (в [3.1.4] об-
суждается процедура, которая комбинирует оба этих свойства).
MOV AH,6 ;номер функции
NEXT: MOV DL,0FFH ;при этом значении принимаем ввод
INT 21H ;выполняем прерывание
JZ NEXT ;если не было ввода, то обратно
CMP AL,13 ;это был возврат каретки?
JE END_INPUT ;если да, то на конец
MOV DL,AL ;иначе посылаем символ в DL
INT 21H ;и выводим его на экран
JMP SHORT NEXT ;повторяем процедуру