Вопрос № 18056: Пожлуйста, помогите, мне очень нужно хорошо разобраться в этом вопросе...
В приложении пример процедуры резидента из 15-ого выпуска рассылки (хотел сунуть весь, но заявили, что максимум дозволеного - 7000 символов... две копии... в досовской и ви...
Вопрос № 18056
Пожлуйста, помогите, мне очень нужно хорошо разобраться в этом вопросе...
В приложении пример процедуры резидента из 15-ого выпуска рассылки (хотел сунуть весь, но заявили, что максимум дозволеного - 7000 символов... две копии... в досовской и виндовской кодироваках...)
Меня интересует процедура Int_21h_proc, а именно то, как мы из нее выходим:
retf 2. Тоесть получается, что мы завершая обработчик, достаем из стека смещение и сегмент, и удаляем из него еще два байта, в которых хранятся флаги... Но почему нам не нужно восстанавливать их??? Правда мы это делаем двумя строками ранее: popf, но ведь это не те флаги, которые были в вызвавшей прерывание программе!!! это флаги, которые мы получили уже внутри своего обработчика (в начале обработчика присутствуют операторы сmр, значит флаги таки меняются, a после сравнений следует pushf (аш два... один съедает
оригинальный обраточик прерывания, который мы вызываем из своего обработчика дальним call\\\\\\\'ом, а второй остается...) Так в чем же дело??? Я пробовал заменить retf 2 на iret (как я понимаю обе команды опустошают стэк ровно на три слова, но вот только первая не востанавливает флаги... поправте если я не прав...), но прога давала збой. (кстати, единственной найденой мною прогой, которая использует прерывания 4F и 4E (поиск файлов с коротким именем) (которые мы и прер
ехватываем в данном случае), оказался Volkov Commander :(...)... Так в чем же дело???? помогите... очень нужно знать (НЕ из простого любопытства)...
Огромнейшее спасибо, елси кто ответит...
Приложение:
Отправлен: 09.03.2005, 23:36
Вопрос задал: CrazyIronToiletPaper (статус: 1-ый класс)
Всего ответов отправлено: 2
Отвечает: Стас
Здравствуйте, CrazyIronToiletPaper!
Флаги не восстанавливаются потому, что флаг CY, установленный внутри Int21 указывает на ошибку выполнения функции.
Странно, что IRET сработал неправильно, ты уверен что ничего не забыл?
>единственной найденой мною прогой, которая использует прерывания 4F и 4E
их много но они старые... прикинь старую досовскую прогу, которой нужно проверить каталог, найти файлы - и там будут использованы 4f и 4e.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 10.03.2005, 00:40 Оценка за ответ: 5
Отвечает: Евгений Иванов
Здравствуйте, CrazyIronToiletPaper!
тебе же ясно сказали, что так надо. ;)
ты же вызвал оригинальный обработчик прерывания, а он флаги изменил, вот их-то и нужно нам вернуть, что мы и делаем, используя retf 2.
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 10.03.2005, 00:56 Оценка за ответ: 5