Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа 4
ОРГАНИЗАЦИЯ ВЫВОДА ИНФОРМАЦИИ НА ЭКРАН
С ИСПОЛЬЗОВАНИЕМ СРЕДСТВ BIOS
Изучение возможностей прерывания BIOS INT 10h для вывода информации на экран монитора.
4.2.1 Графический режим (Gr Graphics или APA - All Points Addressible) позволяет индивидуально управлять свечением каждого пиксела независимо от других. Пиксел (pixel Picture Elevent) одна из точек, составляющих матрицу точек экрана при растровом методе вывода изображения. Отдельному пикселу соответствует ячейка специальной памяти видеопамяти, которая сканируется синхронно с движением луча монитора.
Количество бит видеопамяти, выделяемое на пиксел, определяет возможное состояние пиксела: количество цветов, градаций яркости, иных атрибутов.
Область видеопамяти, требуемая для отображения матрицы всего экрана, называется страницей. При многостраничной организации видеопамяти активна только одна отображаемая на экран.
Знакоместо представляет собой матрицу точек, отображающих символ из определенного набора. В ячейке видеопамяти хранится код символа из таблицы символов и атрибуты: цвета символа и фона, признак мерцания.
Считанные из ячейки видеопамяти данные попадают в знакогенератор специальное запоминающее устройство, вырабатывающее построчную развертку соответствующего символа.
4.2.3 При включении ПК видеоконтроллер обычно устанавливает работу в текстовом 16-цветном режиме с разрешением 80х25 символов (код режима 3). Начальный адрес видеопамяти В8000h, объем 32 Кб.
Организация видеопамяти: на 1 символ приходится 2 байта, первый хранит ASCII-код, второй цвет символа и цвет фона знакоместа (рисунок 4.1).
Столбец 0 Столбец 1 Столбец 79
Символ 0 |
Символ 1 |
… |
Символ 79 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
Символ 80 |
Символ 81 |
… |
Символ 159 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
… |
… |
… |
… |
||||
… |
… |
… |
… |
… |
… |
… |
… |
Символ 1920 |
Символ 1921 |
… |
Символ 1999 |
||||
Код |
Цвет |
Код |
Цвет |
… |
… |
Код |
Цвет |
Строка 0
Строка 24
Рисунок 4.1 - Отображение видеопамяти на экран в текстовом 16-цветном режиме (80х25 символов) [ 8 ]
4.2.4 Формат байта атрибутов:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Мерцание: код цвета фона код цвета символа
1 - мерцание есть 0…7 0…F
0 - обычный текст
4.2.5 Принятые цветовые коды представлены в таблице 4.1
Таблица 4.1 - Цветовые коды
Код |
Цвет |
Код |
Цвет |
0 |
Черный |
8 |
Серый |
1 |
Синий |
9 |
Голубой |
2 |
Зеленый |
A |
Салатный |
3 |
Бирюзовый |
B |
Светло-бирюзовый |
4 |
Красный |
C |
Розовый |
5 |
Фиолетовый |
D |
Св.-фиолетовый |
6 |
Коричневый |
E |
Желтый |
7 |
Светло-серый |
F |
Белый |
4.2.6 При программировании начальный адрес видеопамяти заносится в сегментный регистр ЕS.
4.2.7 На уровне BIOS символы выводятся с использованием функций прерывания INT 10h (таблица 4.2). При программировании с использованием этих функций необходимо помнить, что они сохраняют только регистры BX, CX, DX и сегментные. Сохранность остальных используемых регистров обеспечивается, например, помещением их значений в стек [ 7 ].
Таблица 4.2 - Видеосервис BIOS INT 10h (некоторые функции)
Вход |
Назначение |
Примечание |
||||
AH=0 AL режим дисплея |
Установка режима |
Некоторые режимы дисплея [8] |
||||
Код |
Тип |
Разре- шение |
Размер символа |
Число цв. / адрес видео буфера |
||
1h |
TXT цв |
40х25 |
16 / B8000h |
|||
3h |
TXT цв |
80х25 |
16 / B8000h |
|||
4h |
GR цв |
320x200 |
8х8 |
4 / B8000h |
||
10h |
GR цв |
640x350 |
8х14 |
16 / А0000h |
||
12h |
GR цв |
640x480 |
8х16 |
16 / А0000h |
||
13h |
GR цв |
320x200 |
8х8 |
256 / А0000h |
||
Режимы 0-13h - стандартные для адаптеров MDA, CGA, EGA, VGA. Режимы 14h-17h отражают специфику нестандартных VGA- / SVGA расширений BIOS При установке режима происходит автоматическая очистка экрана. |
||||||
ПРИМЕР Установить стандартный текстовый режим Mov ah, 0 Mov al, 3 ; режим текстовый стандартный Int 10h |
Продолжение таблицы 4.2
AH=1 CH/CL (биты 3…0) номер верхней / нижней строки курсора в знакоместе
|
Установка вертикального размера курсора в TXT |
Строки нумеруются сверху от нуля. Курсор отображается только в режиме TXT. Для цветного дисплея по умолчанию верхняя граница 6, а нижняя 7. 0 1 2 3 4 5 6 7 |
ПРИМЕР Изменить форму курсора на прямоугольную Mov AH, 1 Mov CH, 0 ; самый верх Mov CL, 7 ; самый низ Int 10h |
||
AH=2 BH-номер текстовой видеостраницы DH-номер строки, Y, 024 (29) DL-номер столбца, Х, 0-79 (39) |
Установка позиции курсора. |
В GR устанавливается позиция невидимого курсора. |
ПРИМЕР Установить курсор в 12-ый столбец 5-ой строки mov ah, 2 mov bh, 0 ; видеостраница 0 mov dh, 5 ; строка 5 mov dl, 12 ; столбец 12 int 10h |
||
AH=3 BH-номер видеостраницы |
Получить позицию и размер курсора. |
ВЫХОД: CH / CL номер верхней / нижней строки курсора DH / DL номер строки / столбца Обычно применяется, когда в зависимости от позиции курсора определяется пункт меню. |
Продолжение таблицы 4.2
AH=5 AL номер видеостраницы |
Установить видеостраницу для отображения |
|
AH=6 AL количество прокручиваемых строк BH атрибут заполнителя пустых строк CH / CL номер строки / столбца верхнего левого угла окна DH / DL номер строки / столбца нижнего правого угла окна |
Прокрутка окна вверх |
Область экрана вне окна не изменяется. Если AL=0, окно прокручивается целиком. Действует только на активную страницу дисплея. |
ПРИМЕР Выполнить очистку всего экрана (текстовый режим 3). mov ah, 6 mov al, 0 ; весь экран mov bh,7 ;7d=0000 0111b нормальный атрибут (черно/белый) mov cx,0 ; координаты левого верхнего угла (0,0) mov dx,184Fh ; координаты правого нижнего угла (18h=24d,4Fh=79d) int 10h |
||
AH=7 Аналогично функции 6 |
Прокрутка окна вниз |
Аналогично функции 6 |
AH=8 BH-номер видеостраницы |
Прочитать символ и его атрибуты в текущей позиции курсора |
ВЫХОД: AL - ASCII-код символа AH байт атрибутов |
Продолжение таблицы 4.2
AH=9 AL - ASCII-код выводимого символа BH - номер страницы видеопамяти BL - атрибут (TXT) или цвет (GR) CX - число повторений символа |
Вывод символа с заданным атрибутом в текущую позицию курсора (TXT и GR) |
Записывает один или несколько одинаковых символов, не перемещает курсор. Управляющие символы (возврат каретки, перевод строки…) не действуют, а выводятся, как обычные символы |
ПРИМЕР Вывести пять мигающих "сердечек" в инвертированном виде: mov ah, 9 mov al, 3h ; код символа «сердечко» mov bh, 0 ; видеостраница 0 mov bl, 0F0h ; мигание, инверсия: F0h=1111 0000b mov cx, 5 ; повторить пять раз int 10h |
||
AH=0Ah AL, BН, CX аналогично функции 9 |
Вывод символа с текущим атрибутом в текущую позицию курсора |
Аналогично функции 9 |
AH=0Сh AL код цвета точки CX/DX горизонтальная / вертикальная координата точки BH - номер страницы видеопамяти |
Запись точки в GR |
|
ПРИМЕР Вывести в заданную позицию экрана точку заданного цвета mov ah, 0Ch mov al, цвет ; цвет точки mov cx, столбец ; горизонтальная координата mov dx, строка ; вертикальная координата int 10h |
Продолжение таблицы 4.2
AH=0Еh AL - ASCII-код символа; BH - номер страницы видеопамяти (TXT); BL - цвет символа (для GR). |
Вывод символа в режиме телетайпа |
Cимвол отображается в текущей позиции курсора, затем курсор сдвигается на одну позицию вправо. При необходимости курсор автоматически перемещается на новую строку или выполняется прокрутка окна. Функция использует для форматирования управляющие символы: звуковой сигнал (7h), BackSpace (8h), конец строки (0Ah), возврат каретки (0Dh). В TXT сохраняет текущие атрибуты экрана. В GR можно задать цвет отображаемого символа. |
AH = 0Fh |
Определение текущего режима |
ВЫХОД: AH число символов в строке AL номер текущего режима BH номер активной страницы |
4.3.1 Формулировка задачи
Вывести символ # в позиции номер 2 строки номер 3 экрана желтым цветом по синему фону (использовать прямой вывод в видеопамять).
4.3.2 Постановка задачи
Для вывода символа с заданными атрибутами, используя прямую запись в видеопамять, необходимы следующие действия.
а) Вычислить адрес ячейки видеопамяти, соответствующей указанному в задаче местоположению символа на экране. При этом следует помнить, что начальный адрес видеопамяти - 0B800h, при программировании эта величина заносится в сегментный регистр ES.
б) Принимая во внимание принцип организации видеопамяти, когда на один символ приходится 2 байта, причем первый хранит ASCII-код, второй цвет символа и цвет фона знакоместа, необходимо в первый байт ячейки занести код выводимого символа, во второй его атрибуты.
Схема отображения видеопамяти на экран применительно к условиям задачи представлена на рисунке 4.2.
Для максимального упрощения программы не вводить блоки очистки экрана и остановки для обозрения результатов работы на отдельных этапах
.
ES:[ВХ] строка
0 159
№0
160 319
№1
320 479
№2 480=160*3
№3
SI +0 +1 +2 +3 +4 +5
№0 №1 №2
Нужно поместить: # атрибут
Рисунок 4.2 Схема отображения видеопамяти на экран
4.3.3 Листинг программы
model small
.data
.stack 100h
.code
start:
mov ax, @data
mov ds, ax
; Загрузить в ES начальный адрес текстовой видеопамяти
mov ax, 0B800h
mov es, ax
; определить адрес ячейки, соответствующей начальному символу
; в строке №3: умножить номер строки на 160 количество байт
; видеопамяти, необходимое для описания одной строки экрана
mov al, 160
mov ah, 3
mul ah ; результат в ax
mov bx, ax ; сохранить результат в bx
; определить смещение от начала строки до ячейки,
;соответствующей колонке №2
mov si, 2 ; в si - номер колонки
shl si, 1 ; умножить на 2 (сдвигом влево на одну позицию),
; т.к. на каждый символ приходится 2 байта видеопамяти
; записать код символа в видеопамять
mov byte ptr es:[bx][si], '#'
; записать код цвета в следующий байт
inc si
mov byte ptr es:[bx][si], 1Eh ; 1Eh=0001 1110b
mov ax, 4C00h 1 14(E)
int 21h
end start
4.4.1 Формулировка задачи
Создать окно с координатами (20,5)х(50,15), фон синий. В центре окна вывести слово УРА, буквы соответственно зеленого, белого и красного цвета (текстовый режим).
4.4.2 Постановка задачи
Установить стандартный текстовый режим номер 3. Произойдет автоматическая очистка экрана.
Для создания окна воспользоваться функцией 6 прерывания 10h, позволяющей выполнить прокрутку строк внутри заданной прямоугольной области на экране, установив для нее атрибуты, которые будут действовать по умолчанию, в частности, цвет фона синий (код 1), цвет символов любой, например, светло-серый (код - 7).
Так как каждый символ, по условию, имеет собственный цвет, отличный от принятого по умолчанию, для вывода воспользоваться функцией 9 прерывания 10h. Указанная функция не перемещает курсор, поэтому для его установки применить функцию 2 прерывания 10h.
Создать два массива: один содержит последовательность выводимых символов с символом-ограничителем на конце (использовать 0), другой их атрибуты.
На рисунке 4.3 представлен эскиз создаваемого окна с указанием координат его углов и координат выводимого текста.
5
10 УРА
15
20 35 50
Рисунок 4.3 Эскиз окна для разработки программы
4.4.3 Листинг программы
model small
.stack 100h
.data
mes db 'УРА', 0 ; 0 признак конца вывода
atr db 00010010b, 00011111b, 00010100b ; массив атрибутов
фон синий зеленый белый красный
цвет символа
.code
start: mov ax, @data
mov ds, ax
xor ah, ah ; режим №3
mov al, 3
int 10h
mov ah, 6 ; формирование окна
mov al, 0 ; прокрутка всего окна
mov bh, 17h ; фон синий, буквы светло-серые
mov ch, 5 ; координаты углов прямоугольника - окна
mov cl, 20
mov dh, 15
mov dl, 50
int 10h
mov si, 0
mov dl, 33 ; номер столбца X (начало текста минус 1)
m: mov ah, 2 ; установка курсора
inc dl ; Х := X + 1 ( = 34 в самом начале )
mov bh, 0 ; видеостраница
mov dh, 10 ; строка
int 10h
mov ah, 9 ; вывод символа
mov al, mes[si] ; символ из массива
mov bh, 0
mov bl, atr[si] ; атрибуты из массива
mov cx, 1 ; выводить один символ
int 10h
inc si ; увеличение индекса переход на след. символ
cmp mes[si], 0 ; это последний символ ?
jne m ; если нет на метку
mov ah, 0 ; задержка для обозрения
int 16h
mov ax, 4C00h
int 21h
end start
4.5.1 Формулировка задачи
В графическом режиме вывести изображение российского флага и продемонстрировать возможности вывода символов и смены видеостраниц.
4.5.2 Постановка задачи
Установить графический режим № 10h. При установке произойдет автоматическая очистка экрана.
Российский флаг изобразить с позиции (10, 30) левый верхний угол - размером 120 х 60, соответственно полосы белая, синяя и красная - должны быть шириной по 20, рисунок поместить на видеостранице № 0. Предусмотреть остановку до нажатия любой клавиши.
На той же видеостранице (№ 0) вывести символ 0 голубого цвета, координаты: строка 15, столбец 30.
На видеостранице №1 в том же месте экрана вывести символ 1 желтого цвета. До переключения на страницу №1 изображение невидимо.
Переключить видеостраницы с 0 на 1 и с 1 на 0, каждый раз выполняя задержку до нажатия любой клавиши.
Перед завершением программы восстановить стандартный текстовый режим.
4.5.3 Листинг программы
model small
.stack 100h
.data
mas db 7, 1, 4 ;цвет полос флага: белый, синий, красный
.code
start:
mov ax, @data
mov ds, ax
;графический режим
mov ah, 0
mov al, 10h
int 10h
; вывод прямоугольника
mov bx, -1
mov si, 120 ; размер по горизонтали
mov di, 60 ; размер по вертикали
mov ah, 0Ch
mov dx, 10 ; координаты левого верхнего угла: строка
mov cx, 30 ; столбец
cvet: inc bx ; начальный цвет - белый
mov al, mas[bx]
next:
int 10h
; продвижение по строке
inc cx
dec si ; уменьшение счетчика пикселов в строке
jnz next
;строка выведена, переход на следующую
inc dx
mov cx, 30 ; координата начала строки
mov si, 120 ; начальное значение счетчика
dec di ; уменьшение счетчика строк
cmp di, 40 ; это граница между первой и второй полосами?
je cvet ; да - вторая полоса синяя
cmp di, 20 ;это граница между второй и третьей полосами?
je cvet ; да - третья полоса красная
cmp di, 0 ; все строки выведены?
jnz next ; если не все - в цикл
xor ax, ax
int 16h
;вывод символа на страницу 0 (она активна)
out_c:
mov ah, 2
xor bh, bh ; страница 0
mov dh, 15 ; координаты курсора
mov dl, 30
int 10h
mov ah, 9
mov al, '0' ; символ 0
mov bl, 9 ; цвет - голубой
mov cx, 1
int 10h
; вывод символа на страницу 1 (не активна)
mov ah, 2
mov bh, 1 ; страница 1
mov dh, 15 ; координаты курсора
mov dl, 35
int 10h
mov ah, 9
mov al, '1' ; символ 1
mov bl, 14 ; цвет - желтый
mov cx, 1
int 10h
xor ah, ah ; задержка до нажатия любой клавиши
int 16h
; вывод страницы 1
mov ah, 5
mov al, 1
int 10h
xor ah, ah
int 16h
; вывод страницы 0
mov ah, 5
mov al, 0
int 10h
xor ah, ah
int 16h
; возврат в текстовый режим
xor ah, ah
mov al, 3
int 10h
mov ax, 4C00h
int 21h
end start
Составить программу, выполняющую перечисленные действия. Если нажата не указанная в задании клавиша, завершить программу после вывода сообщения «Программа завершена».
PAGE 53