![]() |
|
![]() ![]() ![]() |
|
xach |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
у меня есть резидентная прога которая вешает свой обработчик на 9h - прерывание (от клавы то бишь) как мне перехватывать нажатия клавиш не поганя информацию для всех последующих обработчиков?
этот вариант не катит (экспериментально убедился =) ) addr - адрес дефольтного обработчика... если делать всё самому то бишь сбрасывать флаг прерывания:
и не вызывать дефольтный обработчик, а ставить
тогда всё прекрасно работает...вотъ... ![]() З.Ы. всё под чистым досом!!! З.З.Ы. возможно любое решение. не обязательно с прерыванием, можно и с какой-либо функций дос...лишь бы работало... заранее мерси! |
||||||
|
|||||||
xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
вот начирикал!
прога в резиденте на escape выводит нолик в левой верхней части экрана. загвоздка в том, что в вин98 отлично пашет (реально клава свободна для ввода команд и т.д.), а под чистым досом подвешивает всё! написана на фасме.
есть идеи? |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Дык она точно резидентно загружается? по-моему нет. поэтому в винде она просто висит в памяти как один из процессов. А в ДОСе многозадачности нет, вот она одна и выполняется
Добавлено через 2 минуты и 36 секунд Если приведённый код и есть вся программа, то в ней нету корректного завершения программы. Правда я на фасме не писал -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
не-не-не!..она возвращает управление volcov commander-у а потом уже виснет...а в винде всё тоже верно, ибо окно-то консольное однозадачное!..хоть и эмуляция.
она и не должна завершаться...загрузочная часть заканчивается int 27h и dos оставляет прогу в резиденте, то бишь просто не даёт никому записаться по этому адресу. а всю работу делает обработчик прерывания...вотъ... Это сообщение отредактировал(а) xach - 21.12.2007, 09:48 |
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Как она может виснуть, если она уже вернула управление в DOS? Или систему вешает сам установленный обработчик при первом нажатии клавиши?
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
да, как только жмёшь на клавишу - виснет...даже не выводит символ...а в консоли винды всё ок...
|
|||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
а это что такое? Разве так надо возвращаться из обработчика прерывания? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 2 Всего: 158 |
||||
|
||||
ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: нет Всего: 17 |
Вот здесь
во время выполнения программы [cs:addr]конечно указывает на обработчик, но ведь потом же программа выгружается и cs может измениться. По-моему, адрес перехода в стандартный обработчик надо указывать по-другому -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
xach |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.10.2004 Где: СПб Репутация: нет Всего: нет |
ksili, dumb, спасибо всё заработало. я и вправду забыл про 100h начального смещения...пишешь его всё время, а потом уже и забываешь что это значит...
![]() [eof] |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 2 Всего: 158 |
|
|||
|
||||
drwatson |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.3.2006 Репутация: нет Всего: нет |
у меня похожая задача: надо по нажатию ctrl+alt+p сделать так чтобы дос перестал реагировать на клаву и начал заново реагировать при повторном нажатие ctrl+alt+p. Само сабой программа резидентная. Вот только не пойму почему постоянно вылетает из доса с ошибкой:
![]() Мой код:
|
|||
|
||||
airyashov |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 1.7.2008 Репутация: 1 Всего: 6 |
одна из ошибок которую вижу это флаги из стека убрать при выходе по метке exit Это сообщение отредактировал(а) airyashov - 28.4.2009, 08:04 -------------------- icq:3(один)7748666 mail:airyashov( а )inbox.ru |
||||
|
|||||
drwatson |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.3.2006 Репутация: нет Всего: нет |
||||
|
||||
drwatson |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 17.3.2006 Репутация: нет Всего: нет |
Ну раз тут так хорошо помогают, позволю себе задать еще один вопрос. А как теперь эту резидентную программу корректно выгрузить? И еще желательно освободить память. А то я просто восстанавливаю вектор девятого прерывания, но программа работает не стабильно.
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Резидентная программа перехватила обработчики некоторых прерываний и сохранила их старые адреса. Для выгрузки надо проверить, что текущие векторы прерываний указывают на резидент. Если это так - просто восстанавливаем старые адреса обработчиков. Если это не так - то сверху стоИт ещё один перехват, и надо принимать специальные меры, которые заключаются в оставлении после себя "заглушки", переадресующей напрямую на сохранённый адрес (far jmp ptr, 5 байт всего). После чего блоки памяти, занимаемые резидентом, освобождаются (в первом случае) либо урезаются (во втором) соотв. функцией 21 прерывания. Впрочем, во втором случае бывает, что на заглушки находится место в, например, блоке среды резидентной части (например, если резидент работал с файлами, блок среды при постановке наверняка не освобождался). -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm для Windows/DOS" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для Windows/Dos | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |