Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Управление прерываниями. Написание собственного прерывания

Поиск

В некоторых случаях бывает полезным написание собственного прерывания. Например, многие программы конкретного пользователя могут использовать процедуру, выводящую строки на экран вертикально. Вместо того чтобы включать её в каждую программу в качестве процедуры, можно установить её как прерывание, написав соответствующую процедуру.

Краткое описание прерываний таблицы векторов прерываний представлено в табл. А.1 приложения А настоящего практикума (IRQ0 – IRQ15 – это аппаратные прерывания). Как следует из табл. А.1, векторы прерываний в диапазоне 60H – 67H отведены для пользовательских прерываний.

Функция 25 h (пересылается в AH) прерывания 21 h устанавливает вектор прерывания на указанный адрес. Адреса имеют размер в два слова. Старшее слово содержит адрес сегмента (CS), младшее - смещение (IP). Чтобы установить вектор, указывающий на одну из процедур пользователя, нужно поместить начальный адрес процедуры в регистр DS (через регистр AX), а смещение – в регистр DX. Номер прерывания, за которым будет закреплена указанная процедура (например, 60 h) помещается в регистр AL. Любая процедура прерывания должна завершаться инструкцией IRET, которая выталкивает из стека три слова: адрес возврата и регистр флагов. Следует отметить, что функция 25 h автоматически запрещает аппаратные прерывания, поэтому не существует опасности, что в процессе перехода к процедуре произойдёт аппаратное прерывание, использующее данный вектор.

Когда программа завершается, должны быть восстановлены оригинальные векторы прерываний. В противном случае последующая программа может вызвать данное прерывание и передать управление на то место памяти, в котором пользовательской процедуры уже нет. Функция 35 h (пересылается в AH) прерывания 21 h возвращает текущее значение вектора прерывания, помещая адрес сегмента в регистр ES, а смещение – в регистр BX. Перед установкой собственного прерывания рекомендуется получить текущее значение вектора, сохранить эти значения и затем восстановить их с помощью функции 25 h (как сказано выше) перед завершением своей программы

Существуют «ловушки», которых следует избегать при написании собственных прерываний. Например, если программа завершается по нажатию «Ctrl + Bre ak», то вектор прерывания не будет восстановлен, если пользователем не предусмотрено противное.

Управление мышью

Манипулятор «мышь» относится к интерактивным устройствам, обеспечивающим связь человека с ВМ.

Единицей перемещения мыши являются «микки» – сигналы, которые подсчитывает мышь, а потом через определённые интервалы передаёт драйверу. Последний использует эти сигналы для определения положения мыши, преобразуя их в пиксели на экране. Драйвер автоматически перемещает курсор на экране в соответствии с движением мыши и отслеживает координаты курсора, а также предоставляет пользовательской программе ряд функций по использованию мыши. Эти функции обрабатываются прерыванием мыши INT 33 h.

Начальная установка драйвера мыши. Функция 0 h (пересылается в AH) прерывания 33 h производит начальную установку и возвращает информацию о текущем состоянии аппаратных и программных средств мыши. Функция определяет текущий режим экрана, прячет курсор и помещает его в центр экрана, а также задаёт начальные значения внутренним переменным драйвера. В качестве результата в регистр AX возвращается значение FFFFh (мышь и драйвер мыши установлены), в регистр BX – количество кнопок мыши: 0002 h – две кнопки, 0003 h – три кнопки, 0000 h – другое количество кнопок. В противном случае, в регистр AX возвращается значение 0000 h – мышь или драйвер мыши не установлены.

Показ/ сокрытие курсора мыши. Драйвер мыши поддерживает внутренний счетчик, управляющий видимостью курсора мыши. Функция 2 h уменьшает значение счетчика на единицу, а функция 1 h увеличивает его, но только до значения 0. Если значение счетчика – отрицательное число, он спрятан, если ноль – показан.

1. Чтобы показать курсор, необходимо в регистр AH переслать функцию 1 h и вызвать прерывание 33 h.

2. Чтобы спрятать курсор, необходимо в регистр AH переслать функцию 2 h и вызвать прерывание 33 h.

Нужно иметь в виду, что на каждый вызов функции 2 h впоследствии должен быть произведен вызов функции 1 h, для того чтобы восстановить внутреннее значение флажка курсора. Кроме того, при каждом переключении режима экрана функция 2 h вызывается автоматически.

Определение состояния мыши. Для определения положения курсора мыши и состояния её кнопок используется функция 3 h (пересылается в AH) прерывания 33 h. В качестве результата эта функция возвращает в регистр BX состояние кнопок мыши, в регистр CX – координату по оси X, в регистр DX – координату по оси Y. В регистре BX первые 3 бита (0 – 2) отвечают за состояние кнопок (табл. 2.9), остальные биты не используются.

Таблица 2.9.

Биты состояния кнопок мыши

Номер бита Описание
0 Левая кнопка мыши
1 Правая кнопка мыши
2 Средняя кнопка мыши

Если бит установлен (равен 1), то соответствующая кнопка нажата, если сброшен (равен 0) – кнопка отпущена.

Возвращаемые координаты совпадают с пиксельными координатами соответствующей точки на экране в большинстве графических режимов, кроме 4, 5, 0Dh, 13h, в которых Х – координату мыши – нужно разделить на 2, чтобы получить номер столбца соответствующей точки на экране. В текстовых режимах обе координаты надо разделить на 8, чтобы получить номер строки и столбца соответственно.

Установка/ отмена обработчика событий мыши. В большинстве случаев указанная выше функция не используется в программах, так как для того, чтобы реагировать на нажатие кнопки или перемещение мыши в заданную область, требуется вызывать это прерывание постоянно, что приводит к трате процессорного времени. Гораздо эффективнее драйверу самому следить за её передвижениями и передавать управление в программу, как только выполнится заранее определенное условие (например, нажатие левой кнопки мыши). В этом случае выполнение прикладной программы временно приостанавливается, и управление передаётся по установленному адресу.

Такую возможность обеспечивает функция 0Ch (пересылается в AH) – установление обработчика событий.

Битовая маска определяет условия, вызывающие прерывания. Установленный программистом в 1 бит разрешает прерывание, сброшенный в 0 – запрещает прерывание. При вызове данной функции битовая маска помещается в регистр CX; описание битов маски представлено в табл. 2.10.

Драйвер фирмы «Microsoft» следит за позицией мыши, а драйверы фирм «Logitech» и «Mouse Systems» – за позицией курсора.

 

Таблица 2.10.

Описание битов маски

Номер бита Описание
0 Изменение позиции курсора мыши
1 Нажатие левой кнопки мыши
2 Отпускание левой кнопки мыши
3 Нажатие правой кнопки мыши
4 Отпускание правой кнопки мыши
5 Нажата средняя кнопка мыши
6 Отпускание средней кнопки мыши
7-15 Не используются

Также при вызове функции пара регистров ES: DX должна содержать адрес дальнего перехода на процедуру обработки прерываний.

Обработчик событий должен быть оформлен как дальняя процедура. На входе в процедуру обработчика необходимо передать следующие параметры:

1) регистр АХ содержит условие вызова (биты установлены так же как и в маске вызова);

2) регистр ВХ содержит состояние кнопок;

3) регистры СХ, DXX - и Y - координаты курсора мыши соответственно;

4) регистры SI, DI – счетчики последнего перемещения по горизонтали и вертикали (единицы измерения для этих счетчиков – микки, 1/200 дюйма).

После завершения работы подпрограммы работа прикладной программы возобновляется в той точке, где была прервана.

Перед завершением программы установленный обработчик событий должен быть обязательно удален (вызов функции 0Ch с СХ = 0), так как иначе при первом же выполнении условия управление будет передано по адресу в памяти, с которого начинался обработчик.



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 259; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.235.195 (0.007 с.)