| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > клавиатура в дос |
| Автор: xach 21.12.2007, 03:13 | ||||||
у меня есть резидентная прога которая вешает свой обработчик на 9h - прерывание (от клавы то бишь) как мне перехватывать нажатия клавиш не поганя информацию для всех последующих обработчиков?
этот вариант не катит (экспериментально убедился =) ) addr - адрес дефольтного обработчика... если делать всё самому то бишь сбрасывать флаг прерывания:
и не вызывать дефольтный обработчик, а ставить
тогда всё прекрасно работает...вотъ... З.Ы. всё под чистым досом!!! З.З.Ы. возможно любое решение. не обязательно с прерыванием, можно и с какой-либо функций дос...лишь бы работало... заранее мерси! |
| Автор: xach 21.12.2007, 09:33 | ||
| вот начирикал! прога в резиденте на escape выводит нолик в левой верхней части экрана. загвоздка в том, что в вин98 отлично пашет (реально клава свободна для ввода команд и т.д.), а под чистым досом подвешивает всё! написана на фасме.
есть идеи? |
| Автор: ksili 21.12.2007, 09:42 |
| Дык она точно резидентно загружается? по-моему нет. поэтому в винде она просто висит в памяти как один из процессов. А в ДОСе многозадачности нет, вот она одна и выполняется Добавлено через 2 минуты и 36 секунд Если приведённый код и есть вся программа, то в ней нету корректного завершения программы. Правда я на фасме не писал |
| Автор: xach 21.12.2007, 09:45 |
| не-не-не!..она возвращает управление volcov commander-у а потом уже виснет...а в винде всё тоже верно, ибо окно-то консольное однозадачное!..хоть и эмуляция. она и не должна завершаться...загрузочная часть заканчивается int 27h и dos оставляет прогу в резиденте, то бишь просто не даёт никому записаться по этому адресу. а всю работу делает обработчик прерывания...вотъ... |
| Автор: ksili 21.12.2007, 09:47 |
| Как она может виснуть, если она уже вернула управление в DOS? Или систему вешает сам установленный обработчик при первом нажатии клавиши? |
| Автор: xach 21.12.2007, 09:49 |
| да, как только жмёшь на клавишу - виснет...даже не выводит символ...а в консоли винды всё ок... |
| Автор: ksili 21.12.2007, 09:59 |
а это что такое? Разве так надо возвращаться из обработчика прерывания? |
| Автор: dumb 21.12.2007, 10:04 | ||
у тебя только PSP занимает 100h + твой код. навскидку - сделай mov dx,200h. а вообще, обычно делают так:
|
| Автор: ksili 21.12.2007, 10:08 |
| Вот здесь во время выполнения программы [cs:addr]конечно указывает на обработчик, но ведь потом же программа выгружается и cs может измениться. По-моему, адрес перехода в стандартный обработчик надо указывать по-другому |
| Автор: xach 21.12.2007, 10:17 |
| ksili, dumb, спасибо всё заработало. я и вправду забыл про 100h начального смещения...пишешь его всё время, а потом уже и забываешь что это значит... [eof] |
| Автор: dumb 21.12.2007, 10:17 |
| нет, там все нормально: при установке обработчика в таблицу векторов прерываний записывается указатель на наш обработчик в форме seg:ofs, где seg = cs, т.е. при вызове обработчика cs устанавливается как нужно. |
| Автор: drwatson 27.4.2009, 23:50 | ||
| у меня похожая задача: надо по нажатию ctrl+alt+p сделать так чтобы дос перестал реагировать на клаву и начал заново реагировать при повторном нажатие ctrl+alt+p. Само сабой программа резидентная. Вот только не пойму почему постоянно вылетает из доса с ошибкой: http://ipicture.ru/Gallery/Viewfull/18074817.html Мой код:
|
| Автор: airyashov 28.4.2009, 08:03 | ||||
одна из ошибок которую вижу это флаги из стека убрать при выходе по метке exit |
| Автор: drwatson 1.5.2009, 12:38 |
| Ну раз тут так хорошо помогают, позволю себе задать еще один вопрос. А как теперь эту резидентную программу корректно выгрузить? И еще желательно освободить память. А то я просто восстанавливаю вектор девятого прерывания, но программа работает не стабильно. |
| Автор: Akina 1.5.2009, 22:44 |
Резидентная программа перехватила обработчики некоторых прерываний и сохранила их старые адреса. Для выгрузки надо проверить, что текущие векторы прерываний указывают на резидент. Если это так - просто восстанавливаем старые адреса обработчиков. Если это не так - то сверху стоИт ещё один перехват, и надо принимать специальные меры, которые заключаются в оставлении после себя "заглушки", переадресующей напрямую на сохранённый адрес (far jmp ptr, 5 байт всего). После чего блоки памяти, занимаемые резидентом, освобождаются (в первом случае) либо урезаются (во втором) соотв. функцией 21 прерывания. Впрочем, во втором случае бывает, что на заглушки находится место в, например, блоке среды резидентной части (например, если резидент работал с файлами, блок среды при постановке наверняка не освобождался). |