27. Создание собственного вектора прерывания

Большинство из готовых прерываний, обеспечиваемых операционной системой, ничто иное, как обычные процедуры, доступные для всех программ, и Вы можете пожелать добавить свое в эту библиотеку. Значения в диапазоне 60h – 7Fh зарезервированы под прерывания пользователя.

Вместо того, чтобы включать процедуру в каждую программу Вы можете установить ее как прерывание, написав программу, которая останется резидентной в памяти после завершения. Тогда Вы можете использовать, например, INT 65H вместо имени процедуры (вызов прерывания несколько медленней, чем вызов процедуры).
Процедура, используемая для обработки прерывания является дальней процедурой :


Interrupt_proc proc far
…
IRET
Interrupt_proc endp

Функция 25H прерывания 21H устанавливает вектор прерывания на указанный адрес. Адреса имеют размер два слова. Старшее слово содержит значение сегмента (CS), младшее содержит смещение (IP).
Чтобы установить вектор, указывающим на одну из Ваших процедур, нужно поместить сегмент процедуры в DS. Затем поместите номер прерывания в AL и вызовите функцию. Любая процедура прерывания должна завершаться не обычной инструкцией RET, а IRET. Отметим, что функция 25H автоматически запрещает аппаратные прерывания в процессе изменения вектора.

Push ds
Mov ah, 25h
Mov al, 65h
Lea dx, Interrupt_proc
Mov bx, seg Interrupt_proc
Mov ds, bx
Int 21h
Pop ds
17.07.2015