- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Работа с видеобуфером.
Текстовый видеобуфер находится по адресу В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.