Лабораторная работа №52 / Задание
.docЗадание:
Написать прерывание 23h –генерируемое при нажатии клавиш Control+C,
И выдача звукового сигнала (печать служебного символа 07h)
При этом необходимо:
-
Обеспечить вызов процедуры не по имени, а по фиксированному номеру.
-
Необходимо использовать процедуры, резидентно хранящихся в памяти.
-
Необходимо расширить функции разработчиков BIOS и ОС.
Существует два способа разработки обработчика прерывания:
-
Это низко уровневый способ в нем номера команд пересылки заполн. адресом своего обработчика.
-
Используются специальные функции 25 и 35 прерывания 21h для задания и сохранения адресов обработчиков.
Тогда необходимо реализовать следующие операции:
-
Сохранить адрес старого обработчика прерывания в буферной памяти.
-
Загрузить вектор с нужным номером
-
Реализовать вызов собственно обработчика
-
Восстановление в векторе адреса старого обработчика прерывания.
Текст программы:
TITLE LAB5 (EXE) Обработчик прерываний
;--------------------------------------------------
stack SEGMENT PARA STACK 'stack'
dw 100 DUP(0)
STACK ENDS
;--------------------------------------------------
DATASEG SEGMENT PARA 'data'
old_es dw 0 ;буфер для хранения адреса
old_ip dw 0 ;старого обработчика прерывания
DATASEG ENDS
;--------------------------------------------------
CODESEG SEGMENT PARA 'code'
.186
assume ss:stack,ds:dataseg,cs:codeseg
start proc near
;Сохранение адреса старого прерывания
mov ax,3523h
int 21h
mov word ptr old_es,es ;сохранение сегмента
mov word ptr old_ip,bx ;и смещения следующей инструкции
;Задание нового обработчика 23h
push ds
mov dx, offset Newint ;Вызов процедуры обработчика
mov ds, ax
mov ax,2523h
int 21h
pop ds
;Тело нового обработчика
Newint proc far
push ax
mov dl,07h ;Генерация звукового сигнала
mov ah,02h
INT 21h
pop ax
mov al,20h
out 20h, al
iret
newint endp
;Восстанавливаем адрес старого обработчика
lds dx, dword ptr old_es ;Восстановление вектора старого
mov ds,dx ;старого обработчика прерывания
mov ax,2523h
int 21h
ret
start endp
CODESEG ENDS ;Конец сегмента
END start ;Конец программы
Обычно все инициализации выносят за пределы обработчика с целью сокращения длины его кода.
Вывод:
Написание обработчиков прерываний на языке Ассемблера может расширить возможности программы. При написании обработчика следует помнить о сохранении используемых данных в стеке, и о возврате к старому обработчику.