Возврат из обработчика прерывания

Тема в разделе "WASM.BEGINNERS", создана пользователем Loginanton, 5 дек 2009.

  1. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    Нужно заменить обработчик прерывания int 9 и в обработчике вывести символ кнопки которая была нажата. У меня после первой обработки прерывания программа похоже зависает (незнаю как точно проверить). Помогите найти ошибку.
    Код(TASM):
    Код (Text):
    1. DOSSEG
    2. .model TINY
    3. .data
    4. string db "i am exit from int9",10,13,"$"
    5. .code
    6. proc_change:
    7. in al, 60h
    8. mov ah, 02h
    9. mov dl, al
    10. int 21h
    11. cmp al, 1h
    12. je exit
    13. iret
    14. start: ; program start here
    15. change_handle_int9:
    16. mov ax, @code
    17. mov ds, ax
    18. mov dx, offset proc_change
    19. mov ah, 25h
    20. mov al, 9h
    21. int 21h
    22. tmp:
    23. jmp tmp
    24. exit:
    25. mov ah, 4ch
    26. int 21h
    27. end start
     
  2. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Код (Text):
    1. iret
    а должен быть passthru
     
  3. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    passthru, что это такое?
     
  4. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Loginanton

    Сразу несколько ошипкоф, начну с самой важной:

    0) "i am exit from int9" -> "I am about to exit from..." ;)
    1) Когда возникает это прерывание - его нужно обработать (отправить определенные команды в контроллер прерывания - серия in/out команд - по крайней мере EOI). Если хочешь сам обрабатывать все - смотри книжки или трассируй оригинальный обработчег, если нет - делай как сказали выше - передавай управление далее в оригинальный обработчег;
    2) Вряд ли получиццо выдавать сообщения через функции дос - дос "нереинтерабелен" (nonre-enterable) - прерывание может быть когда дос что-то там себе делает и когда ты вызовешь его опять (из прерывания) он может потереть свой стек (для теста можно писать прямо в видеобуфер b800:0000 если это режим 03h текст)...

    ...
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Loginanton
    И еще несколько ошипкоф :)

    3) прерывание должно сохранять контекст, в данном случае - как минимум ax, dx.
    4) сигать из обработчика напрямую в код - верный способ порушить стек. Поэтому или через флаг, или извращаясь подменить адрес возврата.
     
  6. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    может кто нить привести пример кода отлавливающего нажатие определённой клавиши,т.е. то что я хотел сделать.
     
  7. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    Loginanton

    Нужно непременно перехватывать int 9? Ну тут бес портофф (in/out) никак не обойтись, а я такого не видел. Можно перехватить - отправить в оригинальный обработчег (pushf/call far) - вернуться - счиать клавишу через int 16h или напрямую из кольцевого буфера. Ну или взять какой-нить keyrus.com/другой русификатор и открыть его в дизасме в расчете найти как это делаецца...
     
  8. Loginanton

    Loginanton New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    74
    PSR1257, мне надо кое какое действие производить при нажатии определённой клавиши (притом чтоб программа выполнялась, а не ждала нажатия и анализировала клавишу), поэтому мне кажется это тока через замену int 9 можно сделать. Вот способ сначала прыгнуть в стандартный обработчик int 9, а потом с помощью int 16 узнать клавишу - интересный, тока мне бы код этого дела, а то я дебагером пользоваться не умею (TD, незнаю как попасть в код обработчика прерывания), было бы вообще классно :)
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Тебе именно в ДОС это надо сделать или ты просто плохо понимаешь, что творишь :)