Подскажите, как можно вызвать процедуру исходной программы (Программа DOS, запущена в Win98) из обработчика прерывания. Т. е. как передать сегмент кода моей программы этому обработчику (который я устанавливаю, модифицируя таблицу векторов прерываний). Пробовал передать в слове через ту же таблицу векторов (прерывание 0xff - вроде оно никем/ничем не используется), но Win98 выкидывает из программы, сообщая об ошибке. Сам обработчик находится в сегменте кода программы, но при попытке использовать этот сегмент для СALL FAR PTR Windows выдает GPF. Может ли сегмент обработчика при выполнении отличатся от сегмента программы, хотя изначально они "были написаны в одном сегменте" (из-за возможности пересечения сегментов)? Обработчик прерывания 0x1C (таймер), ОС WIN98, 16-битныйц режим. Заранее благодарен
При вызове прерывания, адрес происходит следующее: PUSHF; PUSH CS; PUSH IP. Обработчик может прочитать сегмент и смещение вызвевшего его int'а из стека. Но если обработчик в одном сегменте с самой программой, этот адрес уже известен. Ты же сам устанавливаешь обработчик, следовательно сегментный адрес - тот, который задан и другого быть не может. Насчёт CALL FAR PTR, попробуй посмотреть в отладчике, как оно сассемблировалось, возможно проблема в этом. Да и зачем CALL FAR, если вызов внутрисегментный? Достаточно CALL NEAR.
Спасибо за ответ. Правда, CALL NEAR уже пробовал - выкидывает. А вообще допустимо в Win98 из обработчика напрямую модифицировать/читать таблицу векторов?
Да можно, почему же нельзя. Естественно, при выходе из программы всё вернётся на место. Вообще странно. Проверь, не забыл ли что вытолкнуть из стека. Также можно и программку посмотреть.
Вся проблема в том, что выкидывает из программы, если есть такой текст в обработчике MOV ax, es:[4*ffh] Это вообще непонятно. Я где-то читал, что некоторые ОС не позволяют обращаться "не по своим адресам" - только для привилегированных программ. Но Win98... Что самое интересное, вне обработчика я свободно могу сам модифицировать таблицу векторов. А самих вариантов подпрограммы уже штук десять испробовал. Вызываю просто процедуру без параметров на Паскале из подпрограммы-обработчика, без каких-либо действий со стеком. Исходный обработчик пока не восстанавливаю (не могу получить сегмент данных программы, где он был сохранен - опять та же проблема передачи параметров обработчику): procedure testproc; begin end; procedure int1chandler; assembler; asm call NEAR PTR testproc iret end; Сам обработчик с директивой ASSEMBLER, так что никаких дополнительных инструкций манипуляций со стеком в подпрограмме-обрабочике компилятор не генерирует (проверял в IDA)