Страница 22 из 47
4.3.2 Вывод строки символов на экран. Процедуры, которые выводят целые строки символов очень полез- ны, но они могут накладывать ограничения на содержимое выводимой строки. Надо обращать внимание на то, какие управляющие коды (табуляция, пробел и т.п.) интерпретируются, а какие нет. До появления AT BIOS не имел функции вывода строки, хотя MS DOS всегда имела такую фукнцию. Функция BIOS предоставляет больший контроль над атрибутами символов. Естественно, что ее использова- ние создает проблему совместимости с предыдущими машинами. Напо- минаем, что EGA имеет ПЗУ, расширяющее ROM-BIOS и функция вывода строки символов является одним из таких расширений. В этом случае любой IBM PC и XT имеет возможность использовать эту процедуру.
Высокий уровень. Бейсик выводит строку точно так же, как и отдельные символы. Надо просто написать PRINT S$, где S$ может быть любой строкой длиной до 255 символов, которую сконструировала программа. Ин- терпретируются 10 управляющих кодов, а именно:
ASCII 7 звонок ASCII 9 табуляция ASCII 10 перевод строки ASCII 11 курсор в первую позицию экрана (Home) ASCII 12 перевод формата (стирает экран + Home) ASCII 13 возврат каретки ASCII 28 курсор вправо ASCII 29 курсор влево ASCII 30 курсор вверх ASCII 31 курсор вниз
Все остальные коды выводятся на экран как символы.
Средний уровень. Функция 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. Надо поместить дескриптор в BX, а число байтов строки в CX. DS:DX должны указывать на строку. Функция выводит текст с нормальными (белый на черном) атрибутами. Отметим, что не надо предварительно "открывать" дисплей, как это Вы делает с другими файлами при использовании этой функции. Вот пример:
;---вывод 1000 байтов текста MOV AH,40H ;номер функции MOV BX,1 ;дескриптор дисплея LEA DX,STRING ;загржаем адрес строки MOV CX,1000 ;число выводимых байтов INT 21H ;
MS DOS предоставляет набор Esc-последовательностей, которые являются специальными управляющими строками для аппаратуры. Когда они выводятся с помощью функции 9 прерывания 21H, то они могут управлять курсором, режимом дисплея, цветом символов и некоторыми аспектами клавиатуры. В приложении Д обсуждается как их использо- вать. Когда программа выводит на экран много строк, то Esc-после- довательности часто являются самым удобным способом позициониро- вания курсора и установки цвета строки. Это происходит потому, что они сами рассматриваются просто как очередные строки в серии выводимых строк. У AT и машин, снабженных EGA, функция 13H прерывания 10H выво- дит строку. ES:BP должны указывать на строку, а длина строки должна быть в CX. DX указывает позицию курсора, с которой должна начинаться строка (вычисляемую как смещение от начала страницы, на которую идет вывод без учета байтов атрибутов). В BX должен быть указан номер страницы. Наконец номер кода от 0 до 3, содер- жащийся в AL указывает как должна выводиться строка.
AL = 0 строка состоит только из символов, курсор неподвижен AL = 1 строка состоит только из символов, курсор движется AL = 2 в строке чередуются символы и атрибуты, курсор неподвижен AL = 3 в строке чередуются символы и атрибуты курсор движется
Когда AL равно 0 или 1, то атрибуты должны находиться в BL. Все символы будут выводиться с этими атрибутами. Эта функция интерп- ретирует возврат на шаг, перевод строки, возврат каретки и звонок как управляющие команды, а не как печатаемые символы.
Низкий уровень. Ограничение на использование символа $ делает функцию 9 беспо- лезной для многих приложений. Однако на многих машинах это е- динственное прерывание, доступное для вывода строки неизвестной длины. Попробуйте написать свое собственное прерывание (в [1.2.3] показано как), использующее технику отображения в память [4.3.1]. Используйте в качестве ограничителя какой-нибудь специальный символ, например, ASCII 0, вместо $. Сделайте чтобы эта процедура обрабатывала только те управляющие коды, которые нужны Вам. Такой метод будет работать намного быстрее, чем при использовании функ- ции MS DOS.
|