| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm для Windows/Dos > Перехват 16 прерывания |
| Автор: MarkedOne 13.6.2008, 17:37 | ||||
| Написал программу, котороя перехватывает 16 прерывание, если вызвана функция 10h(ожидание нажатия на любую клавишу), то выводится сообщение и управление передается оригинальному обработчику. Запустил её, потом нажимаю на любую клавишу и выскакивает ошибка:
Вот код:
|
| Автор: Akina 13.6.2008, 21:04 |
| Из обработчика 16 прерывания нельзя вызывать прерывания ДОС (за редким исключением, причем функция 9 прерывания 21 в этот список не входит). Используйте для вывода на экран прерывания БИОС. |
| Автор: MarkedOne 14.6.2008, 13:00 |
А какое именно? |
| Автор: MarkedOne 14.6.2008, 14:11 | ||||
Я немного переделал программу, и теперь 21h прерывание вызывается подругому:
Но ошибка всё равно вылетает. И еще, я заметил что если убрать строки:
то ошибки нет, но при вызове 10h функции 16h прерывания ничего не выводится. С помощью этих команд я загружаю в cs текущий сегмент, ведь строка находится в том же сегменте что и прерывание! |
| Автор: Akina 14.6.2008, 20:36 |
Видео, вывод в режиме TTY т.е. программеры в МС таки не идиоты... А я вообще не понимаю, почему вы присваиваете себе право менять содержимое регистров? После окончания работы обработчика ВСЕ регистры (кроме IP) должны содержать то же, что и до вызова... меняете AX, DX, DS? озаботьтесь восстановить перед выходом. |
| Автор: MarkedOne 14.6.2008, 21:18 |
| Точно! Я забыл сохранить регистр DS, а остальные сохранил Добавлено @ 21:26 Теперь всё нормально запускается. Но строка не выводится. Вы про функцию 13h 10h-ого прерывания? Или про прямой вывод, через видеопамять? |
| Автор: Akina 15.6.2008, 22:32 |
да |
| Автор: MarkedOne 16.6.2008, 14:48 |
| Спасибо за помощь |
| Автор: mb78 11.7.2008, 22:48 |
| Вы перепутали! Функция 10h(для DOS) -это видео Bios. А клавиатура- 16h(32 в 10-тичной системе). Выясните лучше , 16 или 16h вы хотите перехватить. Например если 16h-то: mov AX,16h если 10h(16)то - mov AX,10h mov BL,4 mul BL mov CX,0 mov ES,CX mov DI,AX MOV AX,сюда введите строку ,куда перейти, если будет int 16 CLD STOSW MOV AX, СЮДА ВВЕДИТЕ СЕГМЕНТ,НА КОТОРЫЙ НУЖНО ПЕРЕЙТИ ,ЕСЛИ ТОТ ЖЕ,ГДЕ САМА ПРОГРАММА,ТО ВВЕДИТЕ CS STOSW Все теперь прерывание будет переходить по этому адресу.Можно конечно воспользоваться прерыванием int 21 при ah=25h для изменения прерывания ,но я это пробовал ,у меня из Windows это не получилось,а когда сделал вручную,то вышло. |