Страница 20 из 47
Средний уровень. Операционная система предоставляет шесть процедур вывода на экран - три в 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 ;повторяем процедуру
|