![]() |
|
![]() ![]() ![]() |
|
MarkedOne |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.2.2008 Репутация: нет Всего: нет |
Написал программу, котороя перехватывает 16 прерывание, если вызвана функция 10h(ожидание нажатия на любую клавишу), то выводится сообщение и управление передается оригинальному обработчику.
Запустил её, потом нажимаю на любую клавишу и выскакивает ошибка:
Вот код:
|
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Из обработчика 16 прерывания нельзя вызывать прерывания ДОС (за редким исключением, причем функция 9 прерывания 21 в этот список не входит).
Используйте для вывода на экран прерывания БИОС. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
MarkedOne |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.2.2008 Репутация: нет Всего: нет |
||||
|
||||
MarkedOne |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.2.2008 Репутация: нет Всего: нет |
Я немного переделал программу, и теперь 21h прерывание вызывается подругому:
Но ошибка всё равно вылетает. И еще, я заметил что если убрать строки:
то ошибки нет, но при вызове 10h функции 16h прерывания ничего не выводится. С помощью этих команд я загружаю в cs текущий сегмент, ведь строка находится в том же сегменте что и прерывание! |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
Видео, вывод в режиме TTY т.е. программеры в МС таки не идиоты... А я вообще не понимаю, почему вы присваиваете себе право менять содержимое регистров? После окончания работы обработчика ВСЕ регистры (кроме IP) должны содержать то же, что и до вызова... меняете AX, DX, DS? озаботьтесь восстановить перед выходом. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
MarkedOne |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.2.2008 Репутация: нет Всего: нет |
Точно! Я забыл сохранить регистр DS, а остальные сохранил
Добавлено @ 21:26 Теперь всё нормально запускается. Но строка не выводится. Вы про функцию 13h 10h-ого прерывания? Или про прямой вывод, через видеопамять? Это сообщение отредактировал(а) MarkedOne - 14.6.2008, 21:48 |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
MarkedOne |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 8.2.2008 Репутация: нет Всего: нет |
Спасибо за помощь
|
|||
|
||||
mb78 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 11.7.2008 Репутация: нет Всего: нет |
Вы перепутали! Функция 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 это не получилось,а когда сделал вручную,то вышло. Это сообщение отредактировал(а) mb78 - 11.7.2008, 22:56 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |