"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автора

инструкция INT 20H. Поэтому INT 20H выполняется, а это стандарт-
ная функция для завершения программы и передачи управления в DOS.
На рис. 1-5 показан этот процесс. Чтобы заставить прерывание 27H
работать в EXE программе надо поместить 27H во второй байт PSP
(первый содержит машинный код инструкции INT), а затем завершить
программу обычным RET. Для обоих типов файлов прежде чем выпол-
нить прерывание 27H, DX должен содержать смещение конца програм-
мы, отсчитываемое от начала PSP.

Средний уровень.

Вектор прерывания устанавливается с помощью функции 25H преры-
вания 21H, как показано в [1.2.3] (здесь используется вектор
70H). Позаботьтесь, чтобы процедура оканчивалась IRET. Кроме
самой процедуры, устанавливаемая программа не должна делать ниче-
го, кроме инициализации вектора прерывания, присвоения DX значе-
ния смещения конца процедуры и завершения. Для COM файлов просто
поместите оператор INT 27H в конец программы. Для EXE файлов
поместите этот оператор в первое слово PSP и завершите программу
обычным оператором RET. Для того чтобы выполнить процедуру, впос-
ледствии загруженная программа должна вызвать INT 70H.
Приведены примеры для обоих типов файлов (COM и EXE). В обоих
установлена метка FINISH для отметки конца процедуры прерывания
(напоминаем, что знак $ дает значение счетчика команд в этой
точке). Для COM файлов FINISH дает смещение от начала PSP, как и
требуется для прерывания 27H. Для EXE файлов смещение отсчиты-
вается от первого байта, следующего за PSP, поэтому к нему необ-
ходимо прибавить 100H, чтобы пересчитать на начало PSP. Заметим,
что поместив процедуру в начало программы, мы можем исключить
установочную часть кода из резидентной порции. Другой возможный
фокус состоит в использовании инструкции MOVSB для пересылки кода
процедуры вниз в неиспользуемую часть PSP, начиная со смещения
60H, что освобождает 160 байт памяти.

Случай файла COM:
~~~~~~~~~~~~~~~~~
;---здесь процедура прерывания
BEGIN:
JMP SHORT SET_UP ;переход на установку
ROUTINE PROC FAR
PUSH DS ;сохранение регистров
.
(процедура)
.
POP DS ;восстановление регистров
IRET ;возврат из прерывания
FINISH EQU $ ;отметка конца процедуры
ROUTINE ENDP

;---установка вектора прерывания