
- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Вывод на экран текста средствами bios
Много способов вывода текста на экран. Например, функция 09h DOS выводит текст до символа «$», или файл 40h, для которого длина выводимого сообщения. Однако возможности DOS весьма ограничены: DOS не имеет функций для изменения цвета выводимых символов и позиционирования курсора. Текст, выводимый DOS, это последовательность белых символов на черном экране.
Прерывание 10h BIOS позволяет использовать все возможности видеосистемы компьютера и обладает большой скоростью.
Использование памяти BIOS
Положение |
Длина |
Описание |
40:10 |
Байт |
Установленная аппаратура 1 |
40:11 |
« |
« 2 |
40:12 |
« |
Состояние _____________ после включения питания |
40:13 |
Слово |
Размер памяти |
40:15 |
Слово |
Резерв |
40:17 |
Байт |
Управление клавишей 1 |
40:18 |
« |
« 2 |
40:1А |
Слово |
Указатель начала буфера клав. (голова) |
40:1С |
« |
Указатель конца буфера клав. (хвост) |
40:1Е |
32 байта |
Буфер клав. |
40:49 |
Байт |
Режим дисплея |
40:4А |
Слово |
Число колонок |
40:4С |
Слово |
Длина буфера регенерации в байтах |
40:4Е |
« |
Адрес буфера регенерации |
40:50 |
« |
Позиция курсора на стр.1 |
40:52 |
« |
« 2 |
40:54 |
« |
« 3 |
40:56 |
« |
« 4 |
40:58 |
« |
« 5 |
40:5А |
« |
« 6 |
40:5С |
« |
« 7 |
40:5Е |
« |
« 8 |
40:60 |
« |
Тип курсора |
40:62 |
Байт |
Текущая строка изображения |
40:63 |
Слово |
Базовый адрес видеоконтура |
. |
. |
. |
. |
. |
. |
. |
. |
. |
40:6С |
Слово |
Счетчик таймера |
40:70 |
Байт |
|
40:71 |
« |
Сост.клав.Break |
Режимы дисплея
Номер |
Тип |
Макс. цветов |
Формат текста |
Макс. Страниц |
Нач. адрес |
0 |
Т |
16 |
40х25 |
8 |
В8000 |
1 |
Т |
16 |
40х25 |
8 |
В8000 |
2 |
Т |
16 |
80х25 |
4 8 8 |
В8000 |
3 |
Т |
16 |
80х25 |
4 8 8 |
В8000 |
4 |
Г |
4 |
320х200 40х25 |
1 |
В8000 |
5 |
Г |
4 |
320х200 40х25 |
1 |
В8000 |
6 |
Г |
2 |
640х200 80х25 |
1 |
В8000 |
7 |
Т |
Моно |
80х25 |
|
В0000 |
8 |
Г |
16 |
160х200 20х25 |
1 |
В0000 |
9 |
Г |
16 |
320х200 40х25 |
1 |
В0000 |
А |
Г |
4 |
640х200 80х25 |
1 |
В0000 |
D |
Г |
16 |
320х100 40х25 |
8 |
А0000 |
Е |
Г |
16 |
640х200 80х25 |
4 |
“ |
F |
Г |
Моно |
640х350 80х25 |
2 |
“ |
10 |
Г |
16 |
640х350 80х25 |
2 |
“ |
Видеоадаптеры имеют в своем составе оперативную память, однако CPU может обратиться к ней, как к своей оперативной памяти, т.к. адаптер может поддерживать более одной страницы изображения, то не каждой странице имеется свое место для курсора. Когда BIOS переключает со страницы на страницу BIOS запоминает положение курсора на текущей странице.
Информация флагов оборудования определяет какой из адресов буфера будет использовать видеопрограмма BIOS.
5 | 4 биты
40:10 01 - цв. 40х25
- цв. 80х25
– моно?
Для монохромных в ЕS загружается 0В000h, а для цветных ОВ800h – это позволяет остальным программам BIOS работать без информации о том, какой адаптер работает в системе. Все ссылки к буферу делаются ЕS.
В DOS практически нет для работы с цветным адаптером. Такие есть в BIOS. Все следующие функции запрашиваются посредством int 10h
Номер функции в АН Описание
00H |
уст. видео режим |
01H |
уст. размер и форму курсора |
02H |
уст. позицию курсора |
03H |
читать позицию курсора |
04H |
читать световое перо |
05H |
выбрать активную страницу дисплея |
06H |
листать окно вверх (или очистить) |
07H |
листать окно вниз |
08H |
читать символ/атрибут |
09H |
писать символ/атрибут |
0aH |
писать символ |
0bH |
выбрать палитру/цвет бордюра |
0cH |
писать графическую точку |
0dH |
читать графическую точку |
0eH |
писать символ в режиме TTY |
0fH |
читать видео режим |
10H |
EGA уст. палитру |
11H |
EGA генератор символов |
12H |
EGA специальные функции |
13H |
писать строку (только AT + EGA ) |
Многие функции BIOS требуют задания атрибута выводимых символов. Атрибут символа занимает одна байта и определяет цвет символа и фона под ним, а также некоторые дополнительные характеристики изображения. Структура байта атрибутов
Код |
Цвет |
Биты 4-6 цвет фона под символом. |
|
0 |
черный |
Бит 7 – в зависимости от режима видеоодаптера |
|
1 |
синий |
Определяет либо яркость фона под данным символом |
|
2 |
зеленый |
(тогда фон принимает 16 цветов), либо мерцание сим- |
|
3 |
бирюзовый |
вола.. |
|
4 |
красный |
Так, в режиме мерцания значения старшего полубайта |
|
5 |
фиолетовый |
атрибута 8h обозначает не серый фон, а черный при |
|
6 |
коричневый |
мерцающем символе. Сh- не розовый, а красный |
|
7 |
белый |
|
|
8 |
серый |
|
|
9 |
голубой |
|
|
А |
салатовый |
|
|
В |
светло-бирюзовый |
|
|
С |
розовый |
|
|
D |
светло-фиолетовый |
|
|
E |
желтый |
|
|
F |
ярко-белый |
|
; Очистим экран, наложив на него черно-белое окно
mov AH ,06h ; функция задания окна
mov Al, 0 ; режим создания (не прокрутка)
mov BH ,07h ; атребут всех символов в окне – ч/б
mov CH, 0 ; верхняя Y – коорд.
mov CL, O ; левая Х – коорд.
mov DH, 24 ; нижняя Y – коорд.
mov DI, 79 ; правая Х – коорд.
Int 10h ; прер. BIOS.
; Выведем на экран цветное окно
mow AH ,06h ; функция задания окна
mov Al, 0 ; режим создания (не прокрутки)
mov BH, 1Eh ; атрибут желтый по синему
mov CH,5 ; верхняя Y – коорд.
mov CI,40 ; левая Х – коорд.
mov DH, 9 ; нижняя Y – коорд.
mov DI, 75 ; правая Х – коорд.
Int 10h ; прер. BIOS
; Позиционируем курсор
mov AH, 02h ; функция позиционирования
mov BH,0 ; видеостраница
mov DH,7 ; строка
mov DL, 45 ; столбец
Int 10h
; Строку символов в окно без задания атрибутов (т.е. с атрибутами окна)
mov CX, len1 ; длина строки
mov BX,offset mes1 ; адрес строки символа
mov AH,Oeh ; функция выбора одного символа
metka: mov Al, [Bx] ; символ в Al
Int 10h ; сдвиг по строке
Loop metka
; Строка вне окна, задевая атрибуты символов
mov AH, 13h ; функция вывода строки
mov AL,0 ; режим (атрибут в В2)
mov BH,0 ; видеостраница
mov BL,04h ; атрибут всех символов
mov CX, len2 ; длина строки
mov DH,16 ; начало позиции - строка
mov DL,25 ; начало позиции - столбец
push DS ; настройка ЕS на наш сегм.
pop ES ; данные
mov, BP offset mes2 ; ES:BP – выв. стр.
Int 10h
; Позицируем курсор в начало посл. строки экрана
mov AH, 02h ; функция позиционирования
mov BH,O ; видеостраница
mov DH,24 ; строка
mov DL,0 ; столбец
Int 10h
mes1 DB 16,’Cтрока, выведенная в окно’,17
len1 = $-mes1
mes2 DB 22,22,22,’Строка, выведенная вне окна’,22,22,22
len2 =$-mes2
Функция 06h в заданном месте экрана создает цветное окно. Если в созданные ранее окна выведен какой-либо текст, то c помощью этой функции этот текст прокручивается вверх (функция 07h прокручивает вниз). В Аl – число прокручиваемых строк. При этом текст, уход и край окна пропадает, а из-под противоположного края появляются пустые строки с заданными атрибутами. Для заполнения строк используются подсоединенные функции BIOS.
Функция 02h – позиционирование курсора – место положения номер строки (0 – 24) и номер столбца (0…79). Восемь независимых курсоров – на каждую видеостраницу. Функция 02h – позиционирует курсор на любую страницу независимо, какая страница является активной.
Для вывода на экран символов и символов строк используется функция 09h, OАh, OEh и 13h.
Функция ОЕh – фильтрует упр. коды 07h (звук), 08h (возврат каретки на шаг), 10 (перевод строки) и 13 (возврат строки) – выполняя соответствующие им действия после вывода каждого символа курсор перемещается на следующую позицию, что дает возможность выводить в цикл целые строки. Атрибут, однако установить нельзя – символ приобретает атрибут той позиции, куда выводится.
Функция 13h – вывод строк с указанием атрибутов как каждого символа в отдельности, так и всей строки. Четыре варианта выполняются в зависимости от Al. В режиме Al = 0 и 1 – атрибут символа указывается сразу для всей строки.
В режиме 0 – курсор не смещается в процессе
В режиме 1 – смещается на длину строки
В решении (2) и (3) атрибуты символов включаются в выводимую строку, в которой чередуются коды атрибутов и символов. Решение (2) отличается от (3) тем, что в 2 курсор не смещается, а в 3 смещается.
В DХ- координаты начала вывода строки
В СХ- длина
ES:BP- адрес вывода строки
Коды 17h,08h,0Ah,0Dh- как управляющие
с
трока
вокно
строка вне окна
code_seg segment
assume cs:code_seg, ds:code_seg, ss:code_seg
org 100h
start:
jmp begin
line DB 2
column DB 10
sym DB 01h
;
begin:
; mov AH,25h ;функция заполнения вектора прерывания
; mov AL,65h ; номер вектора
; mov DX,offset new_65h ;смещение обработчика
; int 21h
;
xor AX,AX
mov ES,AX
mov BX,65h
shl BX,2
mov ES:[BX],offset new_65h
mov ES:[BX+2],DS
;
mov AL,0 ;режим создания окна
gogo:
int 65h
mov AH,02h
mov BH,0
mov DH,line
mov DL,column
int 10h
mov AH,0Ah
mov AL,sym
mov BH,0
mov CX,60
int 10h
;
inc sym
mov AL,line
cmp AL,24
je follo
inc line
follo:
mov AH,08h
int 21h
;
mov AL,1 ;режим прокрутки
;
jmp gogo
;
new_65h proc near
mov AH,06h
; mov AL,1
mov BH,1Bh
mov cx,0
mov DH,24
mov DL,79
int 10h
iret
;
new_65h endp
code_seg ends
end strart