Замена существующего вектора прерывания

Mov es, ax

Mov ax, 40h

Mov es, ax

Mov ax, 40h

Передача параметров в резидентную программу

Mov es,ax

Mov ax, 40h

Вызов резидентной программы через область межзадачных связей

End begin

Cseg ends

Mov es,ax

Mov ax, 40h

Routine endp

Org 100h

Cseg segment

Mov es,ax

Mov ax, 40h

mov es:0f0h, offset routine ;смещение в сегменте

mov es:0f2h, cs ;адрес сегмента

mov dx, finish ; оставляем программу резидентной

int 27h

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

 

assume cs:cseg, ds:cseg, ss:cseg

begin: jmp short setup

routine proc far ;начало процедуры

push ds ; сохранение регистров

…; здесь тело процедуры

pop ds ; восстановление регистров

iret ;возврат из процедуры

finish equ $ ; определение размера программы

Setup:

mov es:0f0h, offset routine ;смещение в сегменте

mov es:0f2h, cs ;адрес сегмента

;оставляем программу резидентной

mov dx, finish ; размер программы

int 27h ; оставляем программу резидентной

В вызывающей программе следует ввести команды:

call dword ptr es:0f0h

 

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

Перед записью параметров транзитная программа должна загрузить в регистр es адрес области межзадачных связей, затем записать в выбранные ячейки области межзадачных связей адрес массива параметров и содержимое регистра ds(адрес сегмента данных).

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

 

 

Примеры

В транзитной программе:

mov es:0f4h, offset mas; адрес массива

mov es:0f6h, ds ;адрес сегмента данных

 

 

В резидентной программе:

mov si, es:0f4h ;загружаем адрес массива

mov ds, es:0f6h ; загружаем адрес сегмента данных

mov ax, [si] ;в ax – первое слово массива

mov bx, [si+2]

…….

;и так далее

Программист должен обеспечить следующее:

1) выделить буфер для временного хранения существующего вектора прерывания

2) в установочной части резидентной программы записать вектор в эту буферную память

3) при выходе из процедуры предусмотреть восстановление старого вектора прерывания

 

 

 

Пример:

В примере рассмотрена замена существующего вектора прерывания с номером 1chдругим вектором с последующим восстановлением после вызова резидентной программы.