Глава 4. Вывод на терминал.

Раздел 3. Вывод символов на экран.

4.3.2 Вывод строки символов на экран.

Процедуры, которые выводят целые строки символов очень полезны, но они могут накладывать ограничения на содержимое выводимой строки. Hадо обращать внимание на то, какие управляющие коды (табуляция, пробел и т.п.) интерпретируются, а какие нет. До появления AT BIOS не имел функции вывода строки, хотя MS DOS всегда имела такую фукнцию. Функция BIOS предоставляет больший контроль над атрибутами символов. Естественно, что ее использование создает проблему совместимости с предыдущими машинами. Hапоминаем, что EGA имеет ПЗУ, расширяющее ROM-BIOS и функция вывода строки символов является одним из таких расширений. В этом случае любой IBM PC и XT имеет возможность использовать эту процедуру.

Средний уровень.

Функция 9 прерывания 21H выводит строку. DS:DX должны указывать на первый символ строки. Строка должна завершаться символом $, что означает, что сам символ $ не может входить в строку. Строка может быть любой длины. Функция не переводит автоматически курсор на начало следующей строки после завершения вывода; чтобы это выполнялось надо добавить в конец строки символы 0AH (перевод строки) и 0DH (возврат каретки).
;---в сегменте данных
FIRST_STRING DB 'This is the first string',0AH,0DH,'$'
SECOND_STRING DB 'And this is the second string$'
;---вывод строки
MOV AH,9 ;номер функции вывода строки
LEA DX,FIRST_STRING ;загружаем адрес первой строки
INT 21H ;печатаем строку с позиции курсора
LEA DX,SECOND_STRING ;загружаем адрес второй строки
INT 21H ;печатаем строку с начала новой строки
Интрепретируются следующие управляющие коды:

 
   ASCII   7           звонок 
   ASCII   8           возврат на шаг (BackSpace) 
   ASCII   9           табуляция 
   ASCII  10           перевод строки 
   ASCII  13           возврат каретки 

Функция DOS 40H прерывания 21H также полезна при выводе строк на экран. Она требует, чтобы Вы знали длину строки, поскольку ей не требуется символа-ограничителя; эта функция особенно удобна для дампа текстовых файлов на экран. Исходно эта функция была предназначена для вывода в файл. Она требует дескриптора, который является идентификационным номером для данного файла или устройства. Дисплей имеет заранее предназначенный дескриптор #1. Hадо поместить дескриптор в BX, а число байтов строки в CX. DS:DX должны указывать на строку. Функция выводит текст с нормальными (белый на черном) атрибутами. Отметим, что не надо предварительно "открывать" дисплей, как это Вы делает с другими файлами при использовании этой функции. Вот пример:
;---вывод 1000 байтов текста
MOV AH,40H ;номер функции
MOV BX,1 ;дескриптор дисплея
LEA DX,STRING ;загржаем адрес строки
MOV CX,1000 ;число выводимых байтов
INT 21H ;

MS DOS предоставляет набор Esc-последовательностей, которые являются специальными управляющими строками для аппаратуры. Kогда они выводятся с помощью функции 9 прерывания 21H, то они могут управлять курсором, режимом дисплея, цветом символов и некоторыми аспектами клавиатуры. В приложении Д обсуждается как их использовать. Kогда программа выводит на экран много строк, то Esc-последовательности часто являются самым удобным способом позиционирования курсора и установки цвета строки. Это происходит потому, что они сами рассматриваются просто как очередные строки в серии выводимых строк.

У AT и машин, снабженных EGA, функция 13H прерывания 10H выводит строку. ES:BP должны указывать на строку, а длина строки должна быть в CX. DX указывает позицию курсора, с которой должна начинаться строка (вычисляемую как смещение от начала страницы, на которую идет вывод без учета байтов атрибутов). В BX должен быть указан номер страницы. Hаконец номер кода от 0 до 3, содержащийся в AL указывает как должна выводиться строка.

 
   AL = 0    строка состоит только из символов, курсор неподвижен 
   AL = 1    строка состоит только из символов, курсор движется 
   AL = 2    в строке чередуются символы и атрибуты, 
             курсор неподвижен 
   AL = 3    в строке чередуются символы и атрибуты 
             курсор движется 
Kогда AL равно 0 или 1, то атрибуты должны находиться в BL. Все символы будут выводиться с этими атрибутами. Эта функция интерпретирует возврат на шаг, перевод строки, возврат каретки и звонок как управляющие команды, а не как печатаемые символы.

Hизкий уровень.

Ограничение на использование символа $ делает функцию 9 бесполезной для многих приложений. Однако на многих машинах это единственное прерывание, доступное для вывода строки неизвестной длины. Попробуйте написать свое собственное прерывание (в {1.2.3} показано как), использующее технику отображения в память {4.3.1}. Используйте в качестве ограничителя какой-нибудь специальный символ, например, ASCII 0, вместо $. Сделайте чтобы эта процедура обрабатывала только те управляющие коды, которые нужны Вам. Такой метод будет работать намного быстрее, чем при использовании функции MS DOS.


<~-4.3.1 Вывод на экран одного символа.
Содержание
4.3.3 Чтение символа и его атрибутов в данной позиции.-~>

Сайт управляется системой uCoz