Передача параметров обработчику прерывания

Тема в разделе "WASM.BEGINNERS", создана пользователем Skycorner, 23 май 2007.

  1. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Подскажите, как можно вызвать процедуру исходной программы (Программа DOS, запущена в Win98) из обработчика прерывания. Т. е. как передать сегмент кода моей программы этому обработчику (который я устанавливаю, модифицируя таблицу векторов прерываний). Пробовал передать в слове через ту же таблицу векторов (прерывание 0xff - вроде оно никем/ничем не используется), но Win98 выкидывает из программы, сообщая об ошибке. Сам обработчик находится в сегменте кода программы, но при попытке использовать этот сегмент для СALL FAR PTR Windows выдает GPF. Может ли сегмент обработчика при выполнении отличатся от сегмента программы, хотя изначально они "были написаны в одном сегменте" (из-за возможности пересечения сегментов)? Обработчик прерывания 0x1C (таймер), ОС WIN98, 16-битныйц режим. Заранее благодарен
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    При вызове прерывания, адрес происходит следующее: PUSHF; PUSH CS; PUSH IP. Обработчик может прочитать сегмент и смещение вызвевшего его int'а из стека. Но если обработчик в одном сегменте с самой программой, этот адрес уже известен. Ты же сам устанавливаешь обработчик, следовательно сегментный адрес - тот, который задан и другого быть не может. Насчёт CALL FAR PTR, попробуй посмотреть в отладчике, как оно сассемблировалось, возможно проблема в этом. Да и зачем CALL FAR, если вызов внутрисегментный? Достаточно CALL NEAR.
     
  3. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Спасибо за ответ. Правда, CALL NEAR уже пробовал - выкидывает. А вообще допустимо в Win98 из обработчика напрямую модифицировать/читать таблицу векторов?
     
  4. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Да можно, почему же нельзя. Естественно, при выходе из программы всё вернётся на место. Вообще странно. Проверь, не забыл ли что вытолкнуть из стека. Также можно и программку посмотреть.
     
  5. Skycorner

    Skycorner New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    21
    Вся проблема в том, что выкидывает из программы, если есть такой текст в обработчике
    MOV ax, es:[4*ffh]
    Это вообще непонятно. Я где-то читал, что некоторые ОС не позволяют обращаться "не по своим адресам" - только для привилегированных программ. Но Win98... Что самое интересное, вне обработчика я свободно могу сам модифицировать таблицу векторов.

    А самих вариантов подпрограммы уже штук десять испробовал. Вызываю просто процедуру без параметров на Паскале из подпрограммы-обработчика, без каких-либо действий со стеком. Исходный обработчик пока не восстанавливаю (не могу получить сегмент данных программы, где он был сохранен - опять та же проблема передачи параметров обработчику):
    procedure testproc;
    begin

    end;

    procedure int1chandler; assembler;
    asm
    call NEAR PTR testproc
    iret
    end;

    Сам обработчик с директивой ASSEMBLER, так что никаких дополнительных инструкций манипуляций со стеком в подпрограмме-обрабочике компилятор не генерирует (проверял в IDA)