Создание TSR программ в операционной, страница 2

Дня перехвата системного и установки своего прерывания обычно используются две функции DOS (функции 21h-го прерывания):

25h - установить вектор прерывания (Set Interrupt Vector);

35h - прочитать вектор прерывания (Get Interrupt Vector).

Однако, можно воспользоваться и прямой адресацией памяти. Второй вариант (прямое считывание и запись в память) может оказаться неработоспособным для мультипрограммных расширений DOS так как, в них часто используются виртуальные вектора прерываний, а истинные физические адреса векторов остаются неизвестными программе. Оба способа перехвата прерывания проиллюстрированы ниже (перехватывается прерывание 64h):

old_vec      dd      ?           

process:    

- действия TSR процесса -                  

iret

;перехват прерывания  с использованием

; стандартной функции

start:

;запомнить старый вектор

mov  ax, 3564h            

int  21h                 

mov  word ptr old_vec, bx        

mov  word ptr old_vec+2, es

;записать новый вектор

lea  dx, PROCESS               

mov  bx, cs                   

mov  ds, bx                   

mov  ax, 2564h             

int  2lh                      

old_vec      dd      ?

process:

- действия TSR процесса iret

;перехват прерывания прямой перезаписью

start:

;запомнить старый вектор

xor  ax,ax

mov  ea,ax

mov  ax, word ptr еs:[190h]

mov  bx, word ptr es:[192h]

mov  word ptr old_vec, ax

mov  word ptr old_vec+2, bx

;записать новый вектор

lea  ax, PROCESS

mov  bx, cs

cli

mov  word ptr es:[190h], ax

mov  word ptr es:[142h], bx

sti

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

а. Сначала работает пользовательская обработка прерывания, затем происходит передача управления системной программе обработки прерывания с возвращением управления в программу выдавшую команду INT (программу прерванную для обработки запроса IRQ).

b. Сначала управление передается системной программе обработки прерывания, а затем пользовательская программа осуществляет дополнительную обработку, после чего управление возвращается в прерванную программу.

с. Осуществляется только обработка пользователя.

а.

PROCESS:

;действия

;пользователя

jmp old_vector

b.

PROCESS:

pushf ....

call old_vector

;действия

;пользователя

iret

с.

PROCESS:

;действия

;пользователя

iret

Содержание добавочной обработки зависит от ваших требований. Как в программах обработки прерываний, так и в любых других программах требуется уделять повышенное внимание использованию стека. Порча указателя стека, стекового сегмента, несбалансированность команд PUSH и PОР приводят к самым непредсказуемым последствиям.

Требования к резидентным программам. Активизация резидентных программ.

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

Когда резидентная программа оканчивает свою работу она, обычно, должна возвратить управление прерванной программе, причем сохранив в момент прерывания состояние текущего процесса и восстановив его так, чтобы приостановленная на время прерывания программа "не заметила" остановки. Отсюда следует, что к основным требованиям, предъявляемым резидентным программам, должно относится грамотное сохранение состояния прерванного процесса.