Иллюстрированный самоучитель по Assembler


Программирование аппаратных средств - часть 9


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

; синему

mov SI,offset msgdn ;Адрес выводимой строки

jmp commn ;Ha общую часть вывода

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

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

;зеленому

mov SI,offset msgdn ;Адрес выводимой строки

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

commn: mov BX,OB800h ;Настроим ES

mov ES,BX ;на видеобуфер

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

pop DS ;на наш сегмент

mov CX,6 ;Число выводимых символов

mov DI,2000 ;Смещение на экране

cld ;Движение вперед

scr: lodsb ;АL=очередной символ

stosw ;Из АХ на экран

loop scr ;Цикл

jmp outret ;После вывода завершить

;обработку прерывания

new_0c endp

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

;вектора

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

msgup db "Правая"

code ends

stk segment stack

dw 128 dup(O)

stk ends

end main

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

Действия, которые должны инициироваться нажатием левой или правой клавиш мыши (например, включение или выключение некоторого оборудования), в программе заменены выводом на экран коротких диагностических сообщений. Вывод осуществляется прямой записью в видеобуфер, поскольку, как уже говорилось ранее, в обработчике аппаратных прерываний нельзя использовать функции DOS и рискованно - функции BIOS. Вывод на экран с помощью команд обработки строк lodsb и stosw требует настройки большого количества регистров - в DS:SI должен находиться адрес строки-источника, в ES:DI адрес позиции в видеобуфере, в СХ число выводимых символов. Кроме этого, в обработчике прерываний используются регистры АХ, ВХ и DX. Для сохранения всех регистров общего назначения используется команда pusha, а для их восстановления команда рора. Однако эти команды не принимают в расчет сегментные регистры, и их приходится сохранять и восстанавливать от дельными командами.




Начало  Назад  Вперед



Книжный магазин