Нужно заменить обработчик прерывания int 9 и в обработчике вывести символ кнопки которая была нажата. У меня после первой обработки прерывания программа похоже зависает (незнаю как точно проверить). Помогите найти ошибку. Код(TASM): Код (Text): DOSSEG .model TINY .data string db "i am exit from int9",10,13,"$" .code proc_change: in al, 60h mov ah, 02h mov dl, al int 21h cmp al, 1h je exit iret start: ; program start here change_handle_int9: mov ax, @code mov ds, ax mov dx, offset proc_change mov ah, 25h mov al, 9h int 21h tmp: jmp tmp exit: mov ah, 4ch int 21h end start
Loginanton Сразу несколько ошипкоф, начну с самой важной: 0) "i am exit from int9" -> "I am about to exit from..." 1) Когда возникает это прерывание - его нужно обработать (отправить определенные команды в контроллер прерывания - серия in/out команд - по крайней мере EOI). Если хочешь сам обрабатывать все - смотри книжки или трассируй оригинальный обработчег, если нет - делай как сказали выше - передавай управление далее в оригинальный обработчег; 2) Вряд ли получиццо выдавать сообщения через функции дос - дос "нереинтерабелен" (nonre-enterable) - прерывание может быть когда дос что-то там себе делает и когда ты вызовешь его опять (из прерывания) он может потереть свой стек (для теста можно писать прямо в видеобуфер b800:0000 если это режим 03h текст)... ...
Loginanton И еще несколько ошипкоф 3) прерывание должно сохранять контекст, в данном случае - как минимум ax, dx. 4) сигать из обработчика напрямую в код - верный способ порушить стек. Поэтому или через флаг, или извращаясь подменить адрес возврата.
может кто нить привести пример кода отлавливающего нажатие определённой клавиши,т.е. то что я хотел сделать.
Loginanton Нужно непременно перехватывать int 9? Ну тут бес портофф (in/out) никак не обойтись, а я такого не видел. Можно перехватить - отправить в оригинальный обработчег (pushf/call far) - вернуться - счиать клавишу через int 16h или напрямую из кольцевого буфера. Ну или взять какой-нить keyrus.com/другой русификатор и открыть его в дизасме в расчете найти как это делаецца...
PSR1257, мне надо кое какое действие производить при нажатии определённой клавиши (притом чтоб программа выполнялась, а не ждала нажатия и анализировала клавишу), поэтому мне кажется это тока через замену int 9 можно сделать. Вот способ сначала прыгнуть в стандартный обработчик int 9, а потом с помощью int 16 узнать клавишу - интересный, тока мне бы код этого дела, а то я дебагером пользоваться не умею (TD, незнаю как попасть в код обработчика прерывания), было бы вообще классно