Лабораторная работа. Работы с мышью в ассемблере

mouseДля работы в MS-DOS используется прерывание 33h, позволяющее устанавливать драйвер мыши, узнавать координаты мыши, устанавливать обработчик и т.д. Рассмотрим некоторые операции, необходимые для работы с мышью.

Инициализация мыши. Прерывание 33h (далее везде подразумевается это прерывание), значение регистра ax=0000h.

Показать/спрятать курсор. ax=0001h/0002h.

Определить состояние мыши. Номер функции 0003h. Но данная функция используется редко, т.к. необходимо зацикливать программу и вызывать данную функцию. Поэтому не привожу дополнительные параметры. Чаще используется функция
Установить обработчик событий. Приведу подробно работу этой функции. Во-первых, полный набор параметров выглядит следующим образом:

  • AX = 000Ch
  • ES:DX = адрес обработчика
  • СХ = условие вызова
    • бит 0 — любое перемещение мыши
    • бит 1 — нажатие левой кнопки
    • бит 2 — отпускание левой кнопки
    • бит 3 — нажатие правой кнопки
    • бит 4 — отпускание правой кнопки
    • бит 5 — нажатие средней кнопки
    • бит 6 — отпускание средней кнопки
  • СХ = 0000h — отменить обработчик

Обработчик следует оформлять в виде дальней процедуры (то есть завершаться командой RETF). При вызове обработчика регистр СХ содержит Х-координату, а DX — Y-координату.
Следует отметить, что координаты совпадают с координатами соответствующей точки на экране практически во всех графических режимах, кроме 04, 05, 0Dh, 13h. В них Х-координату мыши нужно разделить на 2, для того чтобы получить номер столбца соответствующей точки на экране. В текстовых режимах обе координаты надо разделить на 8, чтобы получить номер строки и столбца соответственно.

Рассмотрим пример вывода точка в месте щелчка мышки (для NASM)

	org	100h
start:
	mov	ax,12h	;инициализация гр. режима
	int	10h
	mov	ax,0	;ин. мыши
	int	33h
	mov	ax,1	; показать курсор
	int	33h

	mov	ax,000ch	; Установка обработки щелчка
	mov	cx,0002h
	mov	dx, mouse_click
	int	33h

	mov	ah,0	; Ожидание ввода символа
	int	16h
	mov	ax,000ch	; Отменить обработчик
	mov	cx,0000h
	int	33h
	mov	ax,3	; возврат в текстовый режим
	int	10h
	ret

mouse_click:
	mov	ax,2	; спрятать курсор
	int	33h
	mov	ah,0ch	; вывести точку
	mov	al,0ah
	int	10h
	mov	ax,1	; показать курсор
	int	33h
	retf	;Обработчик событий должен быть оформлен как дальняя процедура

Задание

  1. Разберитесь с приведенным примером.
  2. Попробуйте различные способы вызовы обработчика.
  3. Модифицируйте программу для работы в текстовом режиме.
  4. Реализуйте возможность изменения выводимого в месте щелчка символа в ходе выполнения программы через ввод символа без эха.
Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru