"Роберт Джордайн. Справочное пособие программиста - 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, как и вается от первого байта, следующего за 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 ;---установка вектора прерывания |
|
|