Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Работа с видеобуфером.

Текстовый видеобуфер находится по адресу В800h.

Рассмотрим распределение адресного пространства МП.

Объем

Физические адреса

Сегментный

Адрес

640

Системные

таблицы и

программы DOS

COMMAND.COM

Свободная память для загружаемых прикладных и системных программ

64

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

A0000h

A000h

32

Свободные адреса

B0000h

B000h

32

Текстовый видеобуфер

B8000h

B800h

64

ПЗУ-расширения BIOS

C0000h

C000h

64

Свободнае адреса

D0000h

D000h

128

ПЗУ BIOS

E0000h

E000h

Первые 640Kб адресного пространства с адресами 00000h до 9FFFFh-отводятся под основную оперативную память, которую еще называют структурной. В начало этой области при начальной загрузке компьютера загружаются таблицы и программы DOS, которые занимают несколько десятков Кбайт.

Оставшаяся память до 640 Кбайт свободна для загрузки любых системных или прикладных программ. В начале сеанса в память загружаются резидентные программы. Объем свободной памяти уменьшается.

Оставшиеся 384Kб адресного пространства распределяются так:

E0000h-FFFFFh - основное ПЗУ BIOS.

C0000h-CFFFFh - ПЗУ расширений BIOS для графических адаптеров и дисков.

Текстовый видеобуфер адаптера EGA включает 8 видеостраниц и занимает 32Кб от сегментного адреса В800h. Начинается он с видеостраницы 0, адрес которой В8000h. Объем видеостраниц 4Kб.

Видеостраница

Начальный адрес

0

В8000

1

В9000

2

ВА000

3

ВВ000

4

BC000

5

BD000

6

BE000

7

BF000 До BFFFF, следующий адрес C0000h

При включении компьютера активной (видимой) становится видеостраница 0. Выводить текст можно на любую страницу, в том числе и невидимую. Смена видеостраниц осуществляется вызовом функции 05 прерывания 10h BIOS.

Любой код, записываемый в видеобуфер, сразу же отображается на экране в виде изображения цветного символа на одном из знакомест. Каждый символ занимает в буфере поле из 2-х байт. Младшие (четные) байты отводятся под коды,отображаемых символов, старшие (нечетные) байты под их атрибуты.

B800h:00 B800h:01 B800h:02 B800h:03 B800h:04…

Символ

Атрибут

Символ

Атрибут

Символ …

Знакоместо 0 знакоместо 1 знаком...

Логическая организация текстового видеобуфера.

2-х байтовые коды символов записываются в видеобуфер в том порядке, в каком они должны появляться на экране, т.е. первые 80 двухбайтовых полей - соответствуют первой строке, вторые 80 - второй строке и т. д. Таким образом, переход на следующую строку осуществляется не с помощью управляющих кодов возврата каретки или перевода строки, а с размещением кодов символа в другом месте буфера, в полях, соответствующих следующей строке. Вообще при формировании изображения непосредственно в видеобуфере, в обход программ DOS и BIOS, все управляющие коды ASCII теряют свои управляющие функции и отображаются в виде соответствующих им символов. Трактовка же кодов 10,13-перевода строки и ВК- выполняется программами DOS или BIOS, которые в данном случае не активизируются.

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

mov AX,0B800h ;сегментный адрес видеобуфера

mov ES,AX ;загрузка в ES

mov BX,80*2*5 ;смещение в видеобуфере(в байтах)

mov AL,’*’ ;код ASCII символа в AL

mov AH,0Eh ;атрибут- желтый на черном

mov ES:[BX],AX ;запись в видеобуфер

mov ES:[BX+162],0B0Fh ;цвет светлобирюзовый по черному, ;символ с кодом ASCII Fh

Выражение 80*2*5 – смещение от начала видеобуфера первого байта строки 5. В регистр AL –соответствующий первому (четному) байту знакоместа, записывается код ASCII требуемого символа, в регистр АН, соответствующий второму (нечетному) байту знакоместа - код атрибута.

Последняя команда -- базово индексная адресация со смещением

[BX(база)+SI(индекс)+смещение]

Код 0Fh - солнышко

Часть данных подготавливается в буфере пользователя и уже потом переносится в видеобуфер.

Команда mov не может осуществлять пересылку из памяти в память. Для этого предусмотрены специальные команды movsb (move string byte- пересылка строки байтов) и movsw(move string word- пересылка строки слов). Команды пересылают по одному элементу строки, кот. Может быть или байтом или словом. Операнд-источник, т.е. исходная строка, адресуется через пару регистров DS:SI . Операнд-приёмник, т.е. строка назначения через ES:DI .

Однократное выполнение команды пересылает один элемент строки, при этом после каждой операции пересылки, регистры SI и DI положительное (если флаг DF регистра флагов равен 0) или отрицательное (если флаг DF=1) приращения. Величина приращения равна 1 или 2 в зависимости от пересылаемых слов.

Д ля movsb приращение SI,DI= +1,DF=0

-1, DF=1

movsw SI,DI= +2,DF=0

-2,DF=1

Для того, чтобы переслать целую строку, команда movsb/movsw предворяется префиксом повторения rep , который заставляет процессор выполнить команду CX раз.

Запишем строку в видеобуфер:

push CS ;DS на наш сегмент

pop DS ; команд

mov AX,0B800h ;

mov ES,AX ;ES-> на видеобуфер

mov SI, offset msg ;SI= адрес источника

movDI, 80*2*12+37*2 ;DI= адрес приёмника

mov CX,msglen ;CX-число пересылаемых битов

cld ; сброс DF - вперед

rep movsb ; пересылка в цикле

;Данные

msg DB ‘П’,1Eh,’р’,1Eh,’Н’,1Eh,’М’,1Eh,’Е’,1Eh,’Р’,1Eh

msglen=$-msg

Сдвиг от начала видеобуфера составляет 12 строк по 80 символов + 37 символов.

В некоторых случаях операции со строками удобнее выполнять от конца строк. Тогда команда std (set direction flag) - установить направление назад.

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

; DS на наш сегмент

; ES на строку 0 видеобуфера

mov DI, 80*2*5 ; начальное смещение на экране

; Будем переносить байт за байтом на экран, вставляя между кодами

; ASCII биты атрибута

mov CX, str_len ; длина строки

movSI,offset str ; смещение исходной строки

cld ; DF=0 вперед

mov AH,attr ; атрибут в AH

next: lodsb ; загрузим в AL очередной символ

stosw ; выгрузим символ = атрибут из AX в ; ;видеобуфер

loop next ; повторять str_len раз

;Данные

str DB ’Пример вывода в видеобуфер’

str_len=$-str

attr DB 1Eh ; атрибут всех символов строк

SI- смещение исходной строки

DI-смещение в видеобуфере

В каждом слове видеобуфера младший байт отводится под код ASCII, старший под код атрибута. Слова, переносимые в видеобуфер, формируются в АХ. Поскольку атрибут не изменяется, он загружается в АН перед началом цикла.

Команда lodsb– загружает в содержимое байта по адресу DS:SI. После чего SI увеличивается на 1. Stosw переносит АХ по адресу ES:DI , после чего увеличивается на 2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]