Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Тема 4.3 Вывод на экран в текстовом режиме




 

Для реализации данных возможностей программа должна использовать видеофункции BIOS. BIOS (Basic Input/Output System — базовая система ввода-вывода) — это набор программ, расположенных в постоянной памяти компьютера, которые выполняют его загрузку сразу после включения и обеспечивают доступ к некоторым устройствам, в частности к видеоадаптеру.

Все функции видеосервиса BIOS вызываются через прерывание 10h. Рассмотрим функции, которые могут быть полезны для вывода текстов на экран.

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

АН = 00 — Установить видеорежим
Ввод: AL = номер режима в младших 7 битах

Вызов этой функции приводит к тому, что экран переводится в выбранный режим. Если старший бит AL установлен в 0, то экран не очищается. Номера текстовых режимов — 0, 1, 2, 3 и 7. Режимы отличаются между собой количеством строк и столбцов, а также количеством видеостраниц. Отметим, что данная функция позволяет переводить и в графические режимы. Но работу в графических режимах рассмотрим позднее. По умолчанию стоит 3-й текстовый режим.

Установить положение курсора
Ввод: АН = 02
ВН = номер страницы
DH = строка
DL = столбец

С помощью этой функции можно установить курсор в любую позицию экрана, и дальнейший вывод текста будет происходить из этой позиции. Отсчет номера строки и столбца ведется от верхнего левого угла экрана (символ в левой верхней позиции имеет координаты 0, 0). Номера страниц 0 – 3 (для режимов 2 и 3)и 0 – 7 (для режимов 1 и 2) соответствуют области памяти, содержимое которой в данный момент отображается на экране. Можно вывести текст в неактивную в настоящий момент страницу, а затем переключиться на нее, чтобы изображение изменилось мгновенно.

Считать положение и размер курсора
Ввод: АН = 03
ВН = номер страницы
Вывод: DH, DL = строка и столбец текущей позиции курсора
СН, CL = первая и последняя строки курсора

Возвращает текущее состояние курсора на выбранной странице (каждая страница использует собственный независимый курсор).

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

Каждый символ на экране описывается двумя байтами — ASCII-кодом символа и байтом атрибута, указывающим цвет символа и фона, а также является ли символ мигающим.

Каждый бит атрибута символа имеет свое назначение:
Бит 7: символ мигает или фон яркого цвета в зависимости от настроек видеофункции.
Биты 6 – 4 задают цвет фона.
Бит 3: символ яркого цвета или фон мигает в зависимости от настроек видеофункции.
Биты 2 – 0 задают цвет символа.

Цвета кодируются следующим способом (первое значение для обычного цвета, второе — для яркого):

000b — черный (темно-серый),

001b — синий (светло-синий),

010b — зеленый (светло-зеленый),

011b — голубой (светло-голубой),

100b — красный (светло-красный),

101b — пурпурный (светло-пурпурный),

110b — коричневый (желтый),

111b — светло-серый (белый).

Обратите внимание на то, что цвета соответствуют шкале RGB.

Считать символ и атрибут символа в текущей позиции курсора

Ввод: АН = 08
ВН = номер страницы
Вывод: АН = атрибут символа
AL = ASCII-код символа.

Вывести символ с заданным атрибутом на экран
Ввод: АН = 09
ВН = номер страницы
AL = ASCII-код символа
BL = атрибут символа
СХ = число повторений символа.

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

Вывести символ с текущим атрибутом на экран, т. е. с атрибутом символа, находящегося ранее в этой позиции.
Ввод: АН = 0Ah
ВН = номер страницы
AL = ASCII-код символа
СХ = число повторений символа.

Вывести символ в режиме телетайпа
Ввод: АН = 0Eh
ВН = номер страницы
AL = ASCII-код символа

Вывести строку символов с заданными атрибутами
Ввод: АН = 13h
AL = режим вывода:

бит 0 — переместить курсор в конец строки после вывода
бит 1 — строка содержит не только символы, но также и атрибуты, так что каждый символ описывается двумя байтами: ASCII-код и атрибут
биты 2 – 7 зарезервированы
СХ = длина строки (только число символов)
BL = атрибут, если строка содержит только символы
DH, DL = строка и столбец, начиная с которых будет выводиться строки
ES: BP = адрес начала строки в памяти

Задания

Задание. 4. 1. Создайте com-файл (или файлы), в котором должны использоваться все указанные функции.

Задание. 4. 2. Нарисуйте «разноцветную рожицу» — глаза в виде ноликов, рот из тире и т. д.

Задание. 4. 3. Используя функции BIOS выведите все 256 символов таблицы ASCII по 16 символов в каждой строке.
Для этого используйте следующий код, ориентированный на NASM:

  org 100h; Начало СОМ-файла

start:

   mov ax, 0003h

   int 10h; Видеорежим 3 (очистка экрана

                   ; и установка курсора в 0, 0)

   mov dx, 0; DH и DL будут использоваться

                   ; для хранения положения курсора.

                   ; Начальное положение - 0, 0

   mov si, 256; SI будет счетчиком цикла

   mov al, 0; Первый символ - с кодом 00h

   mov ah, 9; Номер видеофункции " вывод символа с атрибутом"

   mov cx, 1; Выводится один символ за раз

   mov bl, 00011111b

                   ; атрибут символа - белый на синем

cloop:

   int 10h; Вывести символ на экран

   push ax; Сохранить текущий символ и номер функции

   mov ah, 2; Номер видеофункции 2 -

                   ; изменить положение курсора

   inc dl; Увеличить текущий столбец на 1

   int 10h; Переместить курсор

   mov ax, 0920h; АН = 09, AL = 20h (ASCII-код пробела)

   int 10h; Вывести пробел

   mov ah, 2; Номер видеофункции 2

   inc dl; Увеличить столбец на 1

   int 10h; Переместить курсор

   pop ax; Восстановить номер функции в ah

                   ; и текущий символ в al

   inc al; Увеличить AL на 1 - следующий символ

   test al, 0Fh; Если AL не кратен 16,

   jnz continue_loop

                   ; продолжить цикл,

   push ax; иначе - сохранить номер функции

                   ; и текущий символ

   mov ah, 2; Номер видеофункции 2

   inc dh; Увеличить номер строки на 1

   mov dl, 0; Столбец = 0

   int 10h; Установить курсор на начало следующей строки

   pop ax; Восстановить номер видеофункции

                   ; и текущий символ

continue_loop:

   dec si; Уменьшить SI на 1,

                   ; если он не стал нулем - продолжить

   jnz cloop; CX используется внутри цикла,

                   ; так что нельзя использовать команду LOOP

                   ; для его организации

   ret        ; Завершение СОМ-файла

   end start

Обратим внимание на то, что управляющие символы тоже выведены.

 

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...