Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
26
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 3

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

;Пример 3-12, Программирование мыши в режиме прерываний .586 ;Будут команды новых процессоров

code segment use!6 ;16-разрядное приложение ?

assume CS:code,DS:code ;Данные в сегменте команд

main proc -g

push CS ;Настроим DS i4:

pop DS ;на сегмент команд ::

;Сохраним обработчик прерываний последовательного порта ^

mov AX,350Ch ;Функция 35h, вектор OCh - u

int 21h :,; mov word ptr old_Oc,BX ;Сохраним смещение

mov word ptr old_Oc+2,ES ;Сохраним сегмент w ;Установим наш обработчик прерываний последовательного порта!

mov AX,250Ch ;Функция 25h, вектор OCh /t-

mov DX,ofiset new_0c ;Адрес нашего обработчика г--.

int 21h

;Остановим программу функцией ввода с клавиатуры \ mov AH,01h int 21h восстановим исходный обработчик драйвера мыши

mov

AX,250Ch

Ids

DX,old Oc

int

21h

mov

AX,4COOh

int

21h

main

endp

new_

,0c

proc

pusha

push

DS

push

ES

mov

DX,3F8h

in

AL,DX

cmp

AL,60h

;Функция 25h, вектор OCh ?;«

;Сохраненный адрес •:J,

;3авершим профамму ';i

;Сохраним все регистры ;Сегментные регистры не сохраняются командой pusha ;Порт данных ; Прочитаем

;Левая клавиша — код 60h je ibtn ;Переход на отработку

cmp AL,50h ;Правая клавиша — код 50h

je rbtn ; Переход на отработку

;3авершение обработчика прерываний outret: pop ES ;Восстановим сегментные

pop DS ;регистры

imov AL,20h ;Команда EOI

out 20h,AL ' ;в контроллер прерываний

рора ; Восстановим все регистры

iret ;Выход и^ прерывания

манды и алгоритмы

157

;Если нажата левая клавиша мыши

Ibtn: mov AH,lEh ;Атрибут символов желтый по

;синему

mov SI,offset msgdn;Aflpec выводимой строки jmp commn ;Ha общую часть вывода

;Если нажата правая клавиша мыши

rbtn: mov AH,2Eh ;Атрибут символов желтый по

; зеленому mov SI,offset msgup;Mpec вьтодимой строки

;Общая часть вывода на экран диагностической строки

commn:

mov

mov

ES,BX

push

cs

pop

DS

mov

CX,6

mov

DI.2000

eld

scr: lodsb

stosw

loop

scr

jmp

outret

BX,OB800h ;Настроим ES ;на видеобуфер ; Настроим DS ;на наш сегмент ;Число выводимых символов ;Смегцение на экране ;Движение вперед ;АЬ=очередной символ ;Из АХ на экран ;Цикл

;После вывода завершить ;обработку прерывания

endp dd

new__0c old Oc

О ;Ячейка для исходного

; вектора

msgdn db

msgup db code ends stk segment stack

dw 128 dup(O) stk ends

end main

"Левая!" ;Выводимые сообщения

"Правая"

Приведенный пример с точки зрения его структуры построен обыч­ным образом. Исходное содержимое вектора ОСЬ сохраняется в ячейке old_0c и используется перед завершением программы для восстановления вектора. Для упрощения установки обработчика прерываний программа написана без сегмента данных; ее немногие данные размещены в сегмен­те команд. Поскольку в начале программы регистр DS настраивается на сегмент команд, адресация к данным (в основной программе) возможна через DS, Для того, чтобы можно было наблюдать обработку прерываний от мыши, основная программа после выполнения инициализирующих действий останавливается с помощью функции Olh DOS ожидания ввода символа с клавиатуры. После нажатия любой клавиши программа завер­шается, восстановив предварительно исходное состояние вектора после­довательного порта.

158