Дня перехвата системного и установки своего прерывания обычно используются две функции 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ОР приводят к самым непредсказуемым последствиям.
Требования к резидентным программам. Активизация резидентных программ.
При создании программ, остающихся резидентно в памяти необходимо учитывать ряд специфических требований, определяемых особыми условиями, в которых активизируются и работают эти программы. В самом деле, резидентная программа начинает работать при наступлении какого-то, ожидаемого ею события, как правило, прерывая работу выполнявшейся в этот момент программы.
Когда резидентная программа оканчивает свою работу она, обычно, должна возвратить управление прерванной программе, причем сохранив в момент прерывания состояние текущего процесса и восстановив его так, чтобы приостановленная на время прерывания программа "не заметила" остановки. Отсюда следует, что к основным требованиям, предъявляемым резидентным программам, должно относится грамотное сохранение состояния прерванного процесса.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.