Лабораторная работа. Вывод на экран в текстовом режиме средствами BIOS

biosДанная работа является продолжением лабораторной работы «Вывод на экран в текстовом режиме средствами MS-DOS». Как отмечалось ранее функции MS-DOS вывода на экран позволяют перенаправлять вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста. 

BIOS

Для реализации данных возможностей программа должна использовать видеофункции 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

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

Задание. 4.4. Модифицируйте программу так, чтобы она выдавала русские буквы красным цветом, а цифры — зеленым.

При подготовке материала использована книга С.В.Зубкова «Assembler. Язык неограниченных возможностей».

Лабораторные задания по архитектуре ЭВМ

Если Вы обнаружили ошибку, пожалуйста, выделите ее и нажмите Shift + Enter или нажмите здесь для информирования меня.

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

Один комментарий к “Лабораторная работа. Вывод на экран в текстовом режиме средствами BIOS”

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *