Лекции по Вычислительным машинам, системам и сетям   

5. Программирование на языке Ассемблер

5.14. Прерывания BIOS для работы с экраном

5.14.1. Функция 1 прерывания int 10h

Входные параметры: в ch (биты 4‑0) верхняя строка развертки курсора, в cl (биты 4‑0) нижняя строка развертки курсора.

Подпрограмма позволяет установить конфигурацию (размер по вертикали) курсора. Стандартно (для цветных мониторов) верхняя граница курсора равна 6, а нижняя – 7. Если взять верхнюю границу равной 0, а нижнюю оставить равной 7, курсор будет максимально большим. Это же прерывание позволяет гасить курсор (делать его невидимым). Для этого надо взять ch  =  20, cl  =  0.

Пример.

mov ah, 1

mov ch, 20

mov cl, 0

int 10h.

Фрагмент программы с такими параметрами гасит на экране курсор. Если хотите скрыть курсор, то делайте это в последний момент, когда вся программа уже отлажена. Скрытый курсор может мешать процессу отладки, так как зачастую ошибка заключается в неправильном позиционировании курсора (за пределами экрана).

5.14.2. Функция 2 прерывания int 10h

Входные параметры: в dh номер строки, в dl номер столбца, в bh номер видеостраницы (для нас всегда 0).

Подпрограмма устанавливает курсор в заданную позицию.

Пример. Установить курсор в центр экрана.

mov dx, 0c28h ; 12-я строка (0сh), 40-й столбец (28h).

mov bh, 0

mov ah, 2

int 10h.

5.14.3. Функция 3 прерывания int 10h

Входные параметры: в bh номер видеостраницы (для нас 0).

Прерывание возвращает текущие координаты и конфигурацию курсора: в dh возвращается строка, в dl – столбец, в ch – верхняя строка развертки, в cl – нижняя строка развертки.

Пример. Запомнить текущую позицию курсора в переменной cursor.

mov ah, 3

mov bh, 0

int 10h

mov cursor, dx.

5.14.4. Функция 6 прерывания int 10h

Входные параметры: сх – координаты левого верхнего угла прямоугольной области экрана (chстрока, clстолбец), dxкоординаты правого нижнего угла (dhстрока, dlстолбец), alна сколько строк прокручивать заданное окно (при al  =  0 все заданное окно очищается), bh атрибуты для заполнения освобождающихся строк.

Прокрутка заданной прямоугольной области экрана (окна) на заданное число строк вверх. Такая процедура называется "скроллинг".

Пример. Очистить экран.

mov cx, 0 ; левый верхний угол экрана. Строка = 0, ;столбец = 0.

mov dx, 184fh ; правый нижний угол экрана.

;Строка = 24 (18h), столбец = 79 (4fh)

mov bh,7 ; белый по черному

mov ax, 600h ; функция 6. Очистить весь экран.

int 10h.

5.14.5. Функция 9 прерывания int 10h

Входные параметры: bh - номер видеостраницы (у нас 0), bl ‑ атрибуты символа, al ‑ ASCII-код выводимого символа, сх ‑ число повторений.

Выводит заданный символ в текущую позицию курсора. Курсор при этом не перемещается. В сх помещается число х (х³1). При выводе символ распространяется на х позиций вправо от курсора. То есть, если х = 1, то будет напечатан один символ, при х = 2 ‑ два символа (одинаковых) и т.д. Если cx  = 0, то ничего выводиться не будет!!! Коды 7, 8, 0ah и 0dh являются управляющими.

Пример. Забить верхнюю строку экрана символом "*". Вывод произвести черным по белому.

mov ah, 2 ; устанавливаем курсор

mov bh, 0 ; видеостраница 0

mov dx, 0 ; левый верхний угол экрана

;(строка = столбец = 0)

int 10h

mov ah, 9 ; вывод символа

mov bh, 0 ; видеостраница 0

mov bl, 70h ; черным по белому

mov al, '*'

mov cx, 80 ; заполняем всю строку

int 10h.

5.14.6. Функция 0eh прерывания int 10h

Входные параметры: al ‑ ASCII-код выводимого символа.

Выводит символ в текущую позицию курсора, после чего курсор сдвигается на позицию вправо. Символ выводится с текущими атрибутами.

Очень часто в программах приходится программным образом организовывать задержку. Например, если у нас по экрану летает символ, без задержки он будет летать настолько быстро, что мы увидим только некое мерцание. Есть несколько способов организации такой задержки.

Способ 1. Пустой цикл.

mov cx, 0ffffh ; в cx максимально возможное число

zero_loop: loop zero_loop.

Для современных процессоров эта задержка окажется слишком мала и ее трудно заметить. Приходится делать вложенный пустой цикл. Например, так:

mov bx, 400

m1: mov cx, 0ffffh

m2: loop m2

dec bx

jnz m1.

Недостаток заключается в том, что здесь время задержки зависит от производительности процессора. То есть, для конкретного компьютера ее приходится подбирать, уменьшая или увеличивая наше число 400.

Способ 2.

mov ah, 86h

mov cx, 4

mov dx, 0

int 15h.

Эта функция прерывания int 15h отрабатывает задержку, заданную (в микросекундах) в регистровой паре cx:dx. В приведенном выше примере задержка составит порядка 218 микросекунд, т.е. примерно четверть секунды. Недостаток заключается в том, что некоторые операционные системы (в частности, Windows NT) эту задержку «не понимают» (программа выполняется, а задержки нет).

Способ 3. Работа с системными часами, расположен-ными в области переменных BIOS.

Функция 0 прерывания 1ah возвращает в cx:dx текущее число тиков таймера. Таймер тикает примерно 20 раз в секунду. Отсюда, если реализуем такой фрагмент:

mov ah, 0

int 1ah

mov bx, dx

add bx, 10

mwait:

mov ah, 0

int 1ah

cmp dx, bx

jb mwait ; если меньше, то снова идем на mwait

;и получим задержку на полсекунды.



*****
Новосибирск © 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.