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

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.

Программирование аппаратных средств - часть 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, а для их восстановления команда рора. Однако эти команды не принимают в расчет сегментные регистры, и их приходится сохранять и восстанавливать от дельными командами.




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


508 Resource Limit Is Reached

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.