Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать
  1. Функция 2 прерывание int 10h

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

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

ПРИМЕР: Установить курсор в центр экрана.

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

mov bh, 0

mov ah, 2

int 10h

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

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

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

ПРИМЕР: запомнить текущую позицию курсора в переменной cursor

mov ah, 3

mov bh, 0

int 10h

mov cursor, dx

  1. Функция 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

  1. Функция 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

  1. Функция 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

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

В качестве примера работы с экраном и клавиатурой, приведем программу, демонстрирующую тривиальное передвижение на экране принятого с клавиатуры символа. Программа очищает экран, ждет нажатия любой символьной клавиши, после чего принятый символ пролетает по 12-й строке от левого края экрана к его центру, где и останавливается. Затем программа снова ждет нажатия символьной клавиши и все повторяется сначала. Выход из программы по ESC.

code segment

assume cs:code, ds:code

org 100h

start:

jmp begin

x db 0 ;координата курсора по Х, исходный столбец 0

simb db 0

begin:

; прячем курсор

mov ah, 1

mov ch, 20

mov cl, 0

int 10h

; чистим экран красным цветом, символ будет черным

mov cx, 0

mov dx, 184fh

mov bh, 40h

mov ax, 600h

int 10h

m1:

; ждем нажатия клавиши

mov ah, 0

int 16h

; отсекаем функциональные клавиши

cmp al, 0

je m1

; проверяем на ESC

cmp al, 1bh

je exit

; сохраняем принятый символ

mov simb, al

; выводим пробел в центр экрана (стираем старый символ)

mov ah, 2

mov dx, 0c28h

mov bh, 0

int 10h

mov ah, 0eh

mov al, ' '

int 10h

m2:

; устанавливаем курсор для вывода символа

mov ah, 2

mov bh, 0

mov dh, 12 ; символ летит по 12-й строке

mov dl, x

int 10h

; выводим символ в текущую позицию курсора

mov ah, 9

mov cx, 1

mov bl, 40h

mov bh, 0

mov al, simb

int 10h

; задержка

mov ah, 0

int 1ah

mov bx, dx

add bx, 2

m3:

mov ah, 0

int 1ah

cmp dx, bx

jb m3

; увеличиваем Х координату курсора на единицу

inc x

; проверка на выход за центр экрана (40-й столбец)

cmp x, 41

jne m4

mov x, 0 ; восстанавливаем исходное значение Х координаты курсора

jmp m1 ; пошли на ожидание нажатия клавиши

m4:

; стираем символ в текущей позиции (пробелом)

mov ah, 0eh

mov al, ' '

int 10h

jmp m2 ; пошли на вывод символа в следующей позиции

exit:

mov ah, 4ch

int 21h

code ends

end start

ЗАДАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ «Клавиатура и экран»

1. Программа очищает экран. В центре экрана печатается звез­дочка. С помощью клавиш-стрелок можно перемещать эту звез­дочку по всему экрану, не выходя, однако, за его пределы. В любой момент на экране находится только одна звездочка. Выход из программы по нажатию клавиши TAB.

2. Программа очищает экран. При нажатии любой символьной кла­виши на экране появляется соответствующий символ, который в дальнейшем можно распространять по экрану с помощью кла­виш-стрелок. В любой момент можно сменить символ, нажав другую символьную клавишу. Выход из программы по нажатию клавиши ESC.

3. Программа очищает экран и вырезает в центре экрана инверс­ное окно разумных размеров. Далее, при нажатии любой сим­вольной клавиши её отображение должно появляться внутри этого окна. Таким образом, окно постепенно заполняется вво­димыми с клавиатуры символами. Заполнение окна происходит в общепринятом порядке: слева –направо – сверху - вниз. Выход из программы по нажатию клавиши INS или при полном запол­нении окна.

4. Программа очищает экран. Вводимый с клавиатуры символ по­является одновременно во всех четырех углах экрана и с разумной скоростью слетается по диагоналям в центр экрана, где и застывает. При следующем нажатии любой из символьных клавиш все повторяется. Выход из программы по нажатию кла­виши F10.

5. По экрану (хаотично!) летают два шарика (нули), зеркально отражаясь от его границ. К границе шарики подлетают под углом 45 градусов. Нажатие клавиши SPACE останавливает движение шариков, а последующее нажатие любой другой кла­виши снова его возобновляет. Выход из программы по нажатию клавиши ESC или при столкновении шариков.

6. Программа очищает экран и вырезает в его центре инверсное окно разумных размеров. Вводимый с клавиатуры символ пол­ностью заполняет это окно. При вводе следующего символа всё повторяется. Выход из программы по нажатию F9.

7. Программа очищает экран и вырезает в его центре инверсное окно разумных размеров. Вводимый с клавиатуры символ должен, с разумной скоростью, двигаться вокруг этого окна (по его кромке). При вводе следующего символа всё повторяется. Выход из программы по нажатию F8.

8. После запуска программы по границам очищенного экрана бежит «змей», например из 8-ми звездочек или нулей. С помощью кла­виш-стрелок направление движения «змея» можно менять на 90 градусов от текущего направления. При достижении границы экрана «змей» автоматически заворачивает на 90 градусов вправо, то есть переходит на первоначальную траекторию. Выход из программы по нажатию клавиши SPACE.

9. Программа очищает экран. При вводе символа последний полнос­тью заполняет собой границы экрана. Следующий вводимый сим­вол полностью заполняет собой внешние границы ещё "чистой" области экрана. И так далее. Выход из программы по нажатию клавиши DEL или при полном заполнении экрана.

10. Программа очищает экран и рисует вертикальную инверсную ли­нию, проходящую через весь экран. Эта линия должна иметь 2-3 разрыва шириной 1-2 строки. Затем программа просит игро­ка задать номер строки. После того как номер введен, по соот­ветствующей строке из-за левой границы экрана вылетает ша­рик (например, ноль) и летит по горизонтали через экран (с разумной скоростью). Если шарик попал в разрыв программа, хвалит игрока, если не попал - ругает. Программа предоставляет игроку пять попыток. Выход из программы по нажатию клавиши ESC или после пяти попыток.

11. Программа очищает экран. Внешние границы экрана заполняются звездочками. Начиная с левого верхнего угла по верхней кром­ке экрана выводится фамилия одного из членов бригады. Так как фамилия выводится в ту же строку что и звездочки, то в соответствующих позициях (и только в них) звездочки от­сутствуют. При нажатии клавиши R вся эта картинка начинает с разумной скоростью сдвигаться по часовой стрелке. То есть фамилия вместе со звездочками вращается вокруг экрана, при этом в любой момент времени границы экрана должны быть пол­ностью заполнены, а остальная часть экрана должна быть чис­той. Клавиша S останавливает вращение, клавиша R- возоб­новляет, клавиша ESC- выход из программы.

12. Программа очищает экран и выводит на него набираемую на кла­виатуре информацию, но не в общепринятом порядке (слева – ­направо – сверху – вниз), а сверху – вниз – слева - направо. То есть сначала заполняется крайний левый столбец, затем следующий слева столбец и так далее. Соответственно меняется направле­ние работы управляющих клавиш: ENTER, BACKSPACE, TAB и кла­виш-стрелок. Выход из программы по нажатию клавиши ESC.

Примечание: СКЭН и ASCII коды для различных клавиш можно найти в различных справочниках. Очень хороша для этих целей маленькая программа code.exe.