Изменение таблицы векторов прерываний



 

Вашей программе может потребоваться организовать обработку некоторых прерываний. Для этого программа должна переназначить вектор на свой обработчик. Это можно сделать, изменив содержимое соответствующего элемента таблицы векторов прерывания.

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

Поэтому последовательность действий для нерезидентных программ, желающих обрабатывать прерывания, должна быть такой:

- прочитать содержимое элемента таблицы векторов прерываний для вектора с нужным вам номером

- запомнить это содержимое (адрес старого обработчика прерывания) в области данных программы;

- установить новый адрес в таблице векторов прерываний так, чтобы он соответствовал началу Вашей программы обработки прерывания;

- перед завершением работы программы прочитать из области данных адрес старого обработчика прерывания и записать его в таблицу векторов прерываний.

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

 

Задание

 

Напишите программу, которая перехватывает 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!