Глава 10
Вверх
Прерывание - это своего рода процедура (подпрограмма), которая имеет не название (например print_string), а номер. Всего существует 256 прерываний. Некоторые номера зарезервированы BIOS(ПЗУ) компа, например 16h:
...
Или операционной системой MS-DOS:
...
Тем не менее ничто не мешает программисту перехватить, скажем прерывание 21h и таким образом проконтролировать, кто и что делает с ним.
Например вызовем функцию 09 прерывания 21h:
...
Our_string db 'Привет!$'
В результате операц система выведет на экран сообщение "Привет!". Мы же можем перехватить прерывание 21h, если какая-то программа попытается вывести на экран некую строку, то мы в регистры ds:dx подставим адрес нашей строки. Теперь фукция 09 прерывания 21h будет выводить на экран нашу и только нашу строку. Это можно сделать так:
В приведенном примере проверяем, вызывается ли функция вывода строки на экран 09 прерывания 21h или какая-либо другая. Если вызывается иная функция, то мы просто передаем управление оригинальному обработчику. В противном случае загружаем в ds:dx адрес некоторой нашей строки и опять таки передаем управление оригинальному обработчику прерывания 21h. Что произойдет полагаем догадаться не сложно.
Обработчик прерывания - это процедура, постоянно или временно находящаяся в памяти. Обработчик прерывания первым получает управление, выполняет некоторые действия, а затем передает управление оригинальному обработчику (то есть процедуре, которая уже находилась в памяти до загрузки нашего обработчика). Оригинальный обработчик может так же выполнить некоторые действия, а затем передать управление другому обработчику и тд.
Вообще оригинальные (скажем так, первичные) обработчики MS-DOS прерываний 20h-2Fh находятся в файле IO.SYS/MSDOS.SYS. До того момента, пока они не загрузились в память, эти прерывания грубо говоря "пустые". То есть при попытке вызвать одно из прерываний DOS(ничиная с 20h) до
загрузки указанных выше программ либо ничего не произойдет, либо комп просто зависнет.
Прерывания делятся на программные и аппаратные по способу их вызова.
Программы могут ненадолго заблокировать вызов аппаратных прерываний (кроме немаскируемых, типа деление на нуль) с помощью команды cli в момент выполнения критических участков кода. К таким участкам можно отнести к примеру, смену векторов прерываний напрямую в таблице векторов прерываний или смену стековых регистров. После выполнения необходимых действий программа должна снова разрешить вызов аппаратных прерываний при помощи команды sti.
Если программист забыл разблокировать вызов аппаратных прерываний командой sti после их блокировки командой cli, то пользователь не сможет работать с компом, так как аппаратные прерывания (в том числе и 09h - управление клавиатурой) будут заблокированы, что фактически приведет к зависанию компа. Однако программные прерывания можно вызывать всегда.
Назад |
Начало урока |
Вверх |
Вперед
10.2 Вирус
10.2.1 Структура и принцип работы вируса
10.3 Резидент
10.3.1 Подробней о прерываниях
mov ah,10h
int 16h
...
mov ah,9
mov dx,offset String
int 21h
...
mov ah,9
mov dx,offset Our_string
int 21h
...
...
;----------------------------------------------------------
; Prog10.3.asm Часть нашего обработчика прерывания 21h
;----------------------------------------------------------
cmp ah,9
je Out_str
pop ds
mov dx,offset My_string
jmp Go_21h
...
Однако процессор не всегда продолжает выполнение текущей программы после обработки аппаратного прерывания. В некоторых случаях (например если программа выполнила деление на нуль) продолжение выполнения программы невозможно. Процессор вызывает соответствующее прерывание, которое выводит на экран сообщение "Divide overflow" или подобное ему и останавливает систему.
Содержание