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.


 

Вы находитесь в разделе: 
Также вам будет интересно:

Добавить коментарий