|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.03.2010, 17:37 | #1 |
Пользователь
Регистрация: 26.02.2010
Сообщений: 22
|
Организовать аппаратное прерывание DOS
Вопрос заключается в следующем: как организовать аппаратное прерывание? Конкретно нужно вот что: на любом этапе работы программы при нажатии клавиши (например F1 или Esc) вызывать определенную процедуру. То есть например программа занимается выводом строки на экран (ну или не важно чем), нажимаешь клавишу Esc и управление передается на определенный участок кода. Я что-то не могу придумать как это сделать.
|
13.03.2010, 18:35 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
вешайтесь (перехватывайте на себя) прерывание Int 09 это аппаратное прерывание (IRQ1) вызывается при каждом нажатии и при каждом отпускании клавиши на клавиатуре.
|
13.03.2010, 19:19 | #3 |
Пользователь
Регистрация: 26.02.2010
Сообщений: 22
|
А как его перехватить? Прочитал описание INT 09, особой ясности не внесло.
|
14.03.2010, 20:30 | #4 |
Форумчанин
Регистрация: 08.01.2010
Сообщений: 165
|
Существует два способа перехватить прерывание:
Если ты хочешь воспользоваться первым способом: таблица векторов прерываний расположена по адресу 0000:0000h, адрес каждого обработчика занимает 4 байта: 2 байта на сегмент и 2 байта на смещение. То есть адрес нужного тебе прерывания будет расположен в 0000:0020h (если быть точным, в 0000:0020h - смещение, в 0000:0022h - сегмент). Тебе нужно просто куда-нибудь сохранить адрес обработчика 9-го прерывания, и вместо него указать адрес своего обработчика. Кстати, прежде чем будешь записывать что-то в эту таблицу, следует временно отключить прерывания оператором CLI (ну а после записи в таблицу - включить, при помощи STI) Если захочешь воспользоваться вторым способом: Функция 35h прерывания 21h позволит получить адрес вектора прерывания (после вызова в es окажется сегмент обработчкиа, а в bx - смещение) Функция 25h прерывания 21h устанавливает вектор прерывания. В ds нужно положить сегмент нашего обработчика, в dx - смещение. Ну и в обоих случаях, после своего обработчика следует вызывать стандартный (предварительно записав его адрес). Ну а при выходе из программы следует восстановить старый адрес обработчика. |
14.03.2010, 20:44 | #5 |
Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
Вот пример программы, при нажатии ctrl+a выводит hello world
Код:
Единственное, что ограничивает полет мысли программиста-компилятор
|
15.03.2010, 08:23 | #6 |
Пользователь
Регистрация: 26.02.2010
Сообщений: 22
|
Спасибо, тему можно закрыть.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
прерывание в Си | Misha_M. | Помощь студентам | 2 | 04.02.2010 20:11 |
Программно-аппаратное взаимодействие | iukash | Общие вопросы C/C++ | 5 | 02.07.2009 18:01 |
6 прерывание | ленусик | Фриланс | 1 | 03.06.2008 16:22 |
6 прерывание | ленусик | Помощь студентам | 5 | 30.05.2008 16:57 |