Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
31.23 Кб
Скачать

Задание:

Написать прерывание 23h –генерируемое при нажатии клавиш Control+C,

И выдача звукового сигнала (печать служебного символа 07h)

При этом необходимо:

  1. Обеспечить вызов процедуры не по имени, а по фиксированному номеру.

  2. Необходимо использовать процедуры, резидентно хранящихся в памяти.

  3. Необходимо расширить функции разработчиков BIOS и ОС.

Существует два способа разработки обработчика прерывания:

  1. Это низко уровневый способ в нем номера команд пересылки заполн. адресом своего обработчика.

  2. Используются специальные функции 25 и 35 прерывания 21h для задания и сохранения адресов обработчиков.

Тогда необходимо реализовать следующие операции:

  1. Сохранить адрес старого обработчика прерывания в буферной памяти.

  2. Загрузить вектор с нужным номером

  3. Реализовать вызов собственно обработчика

  4. Восстановление в векторе адреса старого обработчика прерывания.

Текст программы:

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 ;Конец программы

Обычно все инициализации выносят за пределы обработчика с целью сокращения длины его кода.

Вывод:

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

Соседние файлы в папке Лабораторная работа №52