Изменение таблицы векторов прерываний
Вашей программе может потребоваться организовать обработку некоторых прерываний. Для этого программа должна переназначить вектор на свой обработчик. Это можно сделать, изменив содержимое соответствующего элемента таблицы векторов прерывания.
Очень важно не забыть перед завершением работы восстановить содержимое измененных векторов в таблице прерываний, т.к. после завершения работы программы память, которая была ей распределена, считается свободной и может быть использована для загрузки другой программы. Если вы забыли восстановить вектор и пришло прерывание, то система может разрушиться – вектор теперь указывает на область, которая может содержать что угодно.
Поэтому последовательность действий для нерезидентных программ, желающих обрабатывать прерывания, должна быть такой:
- прочитать содержимое элемента таблицы векторов прерываний для вектора с нужным вам номером
- запомнить это содержимое (адрес старого обработчика прерывания) в области данных программы;
- установить новый адрес в таблице векторов прерываний так, чтобы он соответствовал началу Вашей программы обработки прерывания;
- перед завершением работы программы прочитать из области данных адрес старого обработчика прерывания и записать его в таблицу векторов прерываний.
Кроме того, операция изменения вектора прерывания должна быть непрерывной в том смысле, что во время изменения не должно произойти прерывание с номером, для которого производится замена программы обработки. Поэтому перед заменой адреса в таблице векторов прерываний необходимо запретить все прерывания, а после замены разрешить.
|
|
Задание
Напишите программу, которая перехватывает 09h и выполняет следующие функции:
= читает Scan-код нажатой клавиши;
= анализирует введенный Scan-код:
-если введенный Scan-код - это клавиши К1, то включает звук с частотой F1 кГц и переходит к системному обработчику 09h.
-если введенный Scan-код - это клавиши К2, то выключает звук с частотой F1 кГц и переходит к системному обработчику 09h.
-если любой другой Scan-код, то вызывает системный обработчик прерывания 09h.
= выходит из программы по нажатию заданной клавиши
Рисунок 3.2 – Блок - схема основной программы
№ Варианта | F1, кГц | К1 | К2 | Клавиша выхода |
1 | 5,5 | A | 0 | Insert |
Основная программа
Программа перехватывает прерывание 09h. По нажатию клавиши C генерирует звук частотой 9,5 кГц, а по нажатию клавиши 2 выключает звук. По клавише Scroll lock – выход из программы.
stac segment
db 64 dup (0)
ends
data segment
old_offs dw ?
old_seg dw ?
msg db
ends
code segment
|
|
assume ds:data, cs:code, ss:stac
Start: mov ax,data
mov ds,ax
mov es,ax
mov ax,0
mov es,ax
mov ax,es:[0024h]
mov old_offs,ax
mov ax,es:[0026h]
mov old_seg,ax
cli
mov word ptr es:[0024h], offset my_int
mov word ptr es:[0026h], seg my_int
sti
m: mov ah,02h
int 16h
and al,10000000b
jnz m_end
jmp m
m_end:
cli
mov ax,old_offs
mov es:[0024h]
mov ax,old_seg
mov es:[0026h]
sti
mov ax,4C00h
int 21h
my_int proc far
in al,[60h]
cmp al,1eh
jnz m1
mov bx,00d9h
mov al,0beh
out [43h],al
mov al,bl
out [42h],al
mov al,bh
out [42h],al
in al,[61h]
or al,03
out [61h],al
jmp m2
m1: cmp al,0bh
jnz m2
in al,[61h]
and al,0fch
out [61h],al
m2:
mov ah,09h
lea dx,msg
int 21h
jmp dword ptr ds:old_offs
|
|
my_int endp
ends
END Start
ENDStart
Рисунок 3.3 – Результат работы программы
Дата добавления: 2020-01-07; просмотров: 175; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!