Графические устройства

Все изображения купить минет.


 

Вывод текста с использованием поддержки DOS и BIOS

Вывод с помощью функции DOS

Проще всего вывести строку текста на экран с помощью специальной функции DOS, имеющей код 09, поэтому этот способ часто встречается на практике. Перед обращением к DOS адрес начала строки помещается в регистры ds:dx, а код запрашиваемой функции (оэ) — в регистр ah, после чего вызывается программное прерывание int 2in, которое выполняет обращение к DOS.

Предположим, для определенности, что выводимый текст хранится в разделе данных и оформлен одним из следующих способов:

coiranun db 'Проверка возможности вывода текста в режиме SVGA$'
commun db 'Проверка возможности вывода текста в режиме SVGA', 24h

Для функции оэ признаком конца строки является код 24п, которому обычно соответствует изображение знака доллара $. В первой из двух приведенных строк он записан в виде символа, а во второй — в виде кода. Если вы забудете указать признак конца строки, то поведение компьютера при выводе текста будет непредсказуемо.
Для вывода строки commun в нужное место текста задачи включаются три команды, приведенные в примере 5.4.

Пример 5.4. Вывод строки на экран с помощью функции DOS

lea dx, commun ; помещаем в dx адрес начала строки
mov ah, 09 ; указываем код функции DOS
int 21h ; обращаемся к DOS

Функция DOS записывает только коды символов в четные байты видеопамяти, поэтому цвет символов и фона зависит от значений атрибутов, уже находящихся в нечетных байтах видеобуфера.

Текст будет обязательно виден на экране, поскольку он помещается на активную страницу, начиная с позиции, в которой находится курсор. После вывода курсор перемещается в конец текста.

Замечание
Текст направляется на стандартное устройство вывода, которым по умолчанию является дисплей. Задача может изменить установленное по умолчанию устройство, выбрав, например, принтер или дисковод. В таком случае текст будет напечатан на принтере или записан в файл.

Описанная функция лучше всего подходит для вывода на экран заранее заготовленного текста. Заготовки располагают в разделе данных программы и оформляют с помощью директивы db, перед которой указывается метка, подобно тому, как оформлена приведенная выше строка commun. Текст заключается в одинарные или двойные кавычки, коды управляющих символов указываются явно и отделяются друг от друга и от заключенного в кавычки текста запятыми. В качестве управляющих символов могут использоваться "возврат каретки" (0dh), "перевод строки" (0Ah), "табуляция" (09) и др. Например, для привлечения внимания оператора в выводимую строку можно включить код звукового сигнала (07), при его исполнении встроенный динамик ПК издаст гудок. Ограничения на размер выводимого текста нет, если для его размещения на экране не хватит одной строки, то продолжение будет перенесено на следующую.

Поддержка вывода BIOS

Для более гибкого управления процессом вывода текста на экран предназначены функции BIOS, входящие в группу "video Services" (int 10h) и выполняющие следующие действия:

  • 09h — вывод символа и атрибута без перемещения курсора, страница 0;
  • 0Аh — вывод символа без атрибута без перемещения курсора, страница 0;
  • 0Еh — вывод символа без атрибута с перемещением курсора, страница 0;
  • 13h — вывод строки символов с атрибутами на указанную страницу.

Перед вызовом функции 09 и ОАh в регистры записываются следующие величины: в ah — код функции (09 или OAh); в ai — код выводимого символа (ASCII); bb — не используется; в сх — количество повторов символа; bl — код атрибута, который нужен только для функции 09.

Вывод повторяющихся символов

Функции 09 и 0Ah хорошо подходят для вывода повторяющихся символов. В примере 5.5 приведен фрагмент программы, рисующий горизонтальную линию, в которой 132 раза повторяется один из символов псевдографики, имеющий код oc4h (или 196).

Пример 5.5. Построение горизонтальной линии с помощью функции 0Ah

mov ah, OAh ; код запрашиваемой функции BIOS
mov al, OC4h ; код ASCII символа "-"
mov ex, 132 ; число повторений символа
int lOh ; обращение к группе "Video Services"

При выполнении функции OAh записываются только коды символов в четные байты видеопамяти, поэтому цвет линии и фона, на котором она нарисована, зависит от значений ранее записанных атрибутов.

Если вам надо вывести символы вместе с атрибутами, то измените в примере 5.5 код функции на 09 и добавьте команду, записывающую в регистр bl нужный код атрибута. Например, для того чтобы на голубом фоне нарисовать белую линию, атрибут должен иметь код iFh.

Функции 09 и OAh не изменяют позицию курсора, поэтому их неудобно использовать при выводе строки текста. В этом случае вам придется хранить в области данных номера строки и столбца, соответствующие текущим координатам курсора, корректировать их после вывода каждого символа, а перед выводом символа обращаться к BIOS для перемещения курсора в позицию, соответствующую этим координатам.

Вывод строки текста

Для вывода последовательности символов лучше использовать функцию ОЕЬ, которая после записи кода символа в четный байт видеопамяти перемещает курсор вперед на следующую позицию на экране и корректирует сохраняемые в области данных BIOS текущие координаты курсора на используемой странице (см. пример 5.3).

Перед вызовом функции OEh в регистры записываются следующие величины:
в ah — код функции (ОЕЬ); в ai — код выводимого символа (ASCII); bh — не используется, bl— атрибут (только для графических режимов).

Для вывода строки организуется цикл обращений к функции OEh. Управлять его повторами можно с помощью счетчика или повторять процесс вывода до обнаружения в строке специального признака, например символа $, или пустого байта (строка формата ASCIIZ).

В примере 5.6 цикл организован с использованием счетчика, в который перед входом в цикл помещается размер строки commun.

Пример 5.6. Вывод строки с использованием функции BIOS OEh

lea si, commun ; указываем адрес начала строки
mov ex, 48 ; задаем количество символов в строке
lp: lodsb ; читаем в al очередной символ строки
mov ah, OEh ; код запрашиваемой функции
int 10h ; вывод очередного символа
loop lp ; управление циклом

Раскрашивание текста.

BIOS не содержит специальных функций, изменяющих только атрибуты символов, но сочетание функций 09 и ОЕЬ иногда позволяет раскрашивать символы и фон в нужные цвета. Рассмотрим два примера, иллюстрирующих сказанное.

При однократном обращении к функции 09 можно очистить и окрасить выбранным вами цветом все рабочее пространство экрана монитора. Для этого надо переместить курсор в начало активной страницы и заполнить ее отображаемую часть кодами символа "пробел" и атрибута, соответствующего цвету символов и фона. Как это можно сделать, показано в примере 5.7, рассчитанном на выполнение при установленном режиме VESA I09h.
Пример 5.7. "Заливка" экрана синим цветом

mov ах, 920h ; ah = код функции, al = код символа "пробел"
mov bx, IFh ; bh = О, Ы = код атрибута
mov сх, 132*25 ; сх = количество символов 132*25 = 3300
int 10h ; обращение к BIOS

При выполнении примера 5.7 в нулевую страницу видеопамяти, начиная с позиции, соответствующей текущим координатам курсора, будет записано 3300 слов, каждое из которых содержит код iF20h. Если нулевая страница видеопамяти является активной, а курсор находится в ее левом верхнем углу, то все рабочее пространство экрана будет очищено от находившихся там символов и окрашено в синий цвет. После этого символы, выводимые на экран с помощью функции ОЕЬ, будут окрашены в белый цвет (напомним, что код атрибута iFh соответствует белым символам и синему фону). Исходные координаты курсора не изменяются.

В том случае, когда надо выделить заданным цветом одно слово или фразу, можно использовать подпрограмму, приведенную в примере 5.8. Перед обращением к ней в регистрах ds:si указывается адрес начала строки в оперативной памяти, а в сх — количество символов в строке, В регистре ы помещается код атрибута, ьь не используется.

Пример 5.8. Подпрограмма для вывода символов и атрибутов

Coiortxt: mov ax, 920h ah = код функции, al = код символа "пробел"
int 10h закрашивание нужного пространства
Outsym: lodsb al = код очередного символа, si = si + 1
mov ah, OEh код функции BIOS
int lOh вывод очередного символа
loop Outsym управление циклом
ret возврат из подпрограммы

В примере 5.8 используется тот факт, что для функции 09 количество повторов указывается в регистре сх, а при ее выполнении позиция курсора не изменяется. При выполнении функции 09 в видеопамять записывается код символа "пробел" вместе с указанным в регистре ы атрибутом. Затем в цикле, имеющем метку Outsym, на то же место выводится текст, который будет окрашен в соответствии с атрибутом, уже записанным в видеопамять.

Позиционирование текста

Для расположения текста в нужном месте экрана можно использовать описанную в разделе функцию прерывания int lOh, имеющую код 02. В примере 5.9 приведен фрагмент программы, при выполнении которого курсор будет перемещен в 42-й столбец 12-й строки.

Пример 5.9. позиционирование курсора с помощью функции BIOS 02

хог bh, bh ; номер страницы О
BJOV dh, 12 ; номер строки 12
mov dl, 42 ; номер столбца 42
mov ah, 2 ; код функции BIOS
int lOh ; позиционирование курсора

Если после выполнения команд примера 5.9 в текущую позицию вывести строку commun, описанную в начале раздела, то при работе в режиме VESA I09h она окажется расположенной в центре экрана.

Напомним, что функции, выполняющие вывод текста на экран, вычисляют адрес видеопамяти по тем значениям координат, которые хранятся в одном из слов области данных BIOS (см. пример 5.3). Фактическое расположение курсора на экране будет соответствовать этим координатам, только если его перемещают функции BIOS.

Использование функции 13h

Эта функция предназначена для вывода строки текста с явным указанием координат ее начала на экране и возможностью раскрашивания текста. В процессе вывода в видеопамять записываются коды символов и атрибутов. Атрибут может быть общим для всех символов строки или индивидуальным для каждого символа. Во втором случае выводимая строка должна содержать не только коды символов, но и их атрибуты. После вывода текста функция может переместить курсор в текущую позицию или не изменять его исходную позицию.

Для реализации перечисленных возможностей перед вызовом функции I3h в регистре ai указывается код режима вывода, который изменяется от 0 до 3:

  • в режимах 0 и 1 код атрибута выбирается из регистра ы;
  • в режимах 2 и 3 коды атрибутов выбираются из выводимой строки;
  • в режимах 1 и 3 курсор перемещается после вывода текста;
  • в режимах 0 и 2 курсор остается на исходной позиции.

Кроме указания режима, перед обращением к BIOS должны быть заполнены следующие регистры: es:bp — адрес начала строки в оперативной памяти; сх — количество символов в строке; bh — номер страницы, который используется при выводе; dh, dl — номера строки и столбца.

При выполнении примера 5.10 строка commun, описанная в начале раздела, выводится в центр экрана. Символы строки будет расположены на синем фоне и окрашены в белый цвет. Курсор будет перемещен в позицию, расположенную после.выведенного текста.

Пример 5.10. Вывод текста с использованием функции BIOS 13h

push es сохранение содержимого es
push ds помещаем содержимое ris в стек
pop es и выталкиваем его в регистр es
lea bp, commun bp = адрес строки в сегменте ds
mov ex, 48 указываем в сх размер строки
mov bx, IFh bh = 0, Ы = IFh
mov dh, 12 dh = номер исходной строки
mov dl, 42 dl = номер исходного столбца
mov ax, 1301h ah = код функции, al = режим вывода
int iOh BIOS выводит строку
pop es восстанавливаем содержимое es

Из текста примера 5.10 видно, что перед обращением к функции 13h приходится выполнять достаточно много вспомогательных действий. Поэтому при программировании конкретной задачи вам придется выбирать, что лучше -составить собственную подпрограмму или использовать описанную функцию. Автор предпочитает работать с собственными подпрограммами.

Замечание
Функции ОЕЬ и I3h анализируют установленный видеорежим, поэтому их можно использовать для вывода текста при работе во всех графических видеорежимах, соответствующих стандартам IBM (но не стандартам VESA).

 
Назад Начало Вперед