Замена существующего вектора прерывания
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другим вектором с последующим восстановлением после вызова резидентной программы.