Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчеты по Курсовой Работе / 13 Сутыгин Б06-781-1.docx
Скачиваний:
45
Добавлен:
12.03.2015
Размер:
70.18 Кб
Скачать

Листинг программы main.Asm

.386P

;Плоская модель памяти.

.MODEL FLAT, STDCALL

;Константы.

STD_OUTPUT_HANDLE equ -11

STD_INPUT_HANDLE equ -10

;Тип события.

KEY_EV equ 1h

MOUSE_EV equ 2h

; константы - состояния клавиатуры

RIGHT_ALT_PRESSED equ 1h

LEFT_ALT_PRESSED equ 2h

RIGHT_CTRL_PRESSED equ 4h

LEFT_CTRL_PRESSED equ 8h

SHIFT_PRESSED equ 10h

NUMLOCK_ON equ 20h

SCROLLLOCK_ON equ 40h

CAPSLOCK_ON equ 80h

ENHANCED_KEY equ 100h

;Прототипы внешних процедур.

EXTERN wsprintfA:NEAR

EXTERN GetStdHandle@4:NEAR

EXTERN WriteConsoleA@20:NEAR

EXTERN SetConsoleCursorPosition@8:NEAR

EXTERN SetConsoleTitleA@4:NEAR

EXTERN FreeConsole@0:NEAR

EXTERN AllocConsole@0:NEAR

EXTERN CharToOemA@8:NEAR

EXTERN SetConsoleTextAttribute@8:NEAR

EXTERN ReadConsoleInputA@16:NEAR

EXTERN ExitProcess@4:NEAR

;Директивы компоновщику для подключения библиотек.

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

;------------------------------------------------

COOR STRUC

X WORD ?

Y WORD ?

COOR ENDS

;Сегмент данных.

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

HANDL DWORD ?

HANDL1 DWORD ?

TITL DB "Обработка событий мыши",0

BUF DB 200 dup(0)

LENS DWORD ? ;Количество выведенных символов.

CO DWORD ?

FORM DB "Координаты: %u %u ",0

CRD COOR <?>

STR1 DB "Для выхода нажмите ESC",0

MOUS_KEY WORD 19 dup(?)

_DATA ENDS

;Сегмент кода.

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

;Образовать консоль.

;Вначале освободить уже существующую.

CALL FreeConsole@0

CALL AllocConsole@0

;Получить HANDL1 ввода.

PUSH STD_INPUT_HANDLE

CALL GetStdHandle@4

MOV HANDL1,EAX

;Получить HANDL вывода.

PUSH STD_OUTPUT_HANDLE

CALL GetStdHandle@4

MOV HANDL,EAX

;Задать заголовок окна консоли.

PUSH OFFSET TITL

PUSH OFFSET TITL

CALL CharToOemA@8

PUSH OFFSET TITL

CALL SetConsoleTitleA@4

;*************************************

;Перекодировка строки.

PUSH OFFSET STR1

PUSH OFFSET STR1

CALL CharToOemA@8

;Длина строки.

PUSH OFFSET STR1

CALL LENSTR

;Вывести строку.

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET STR1

PUSH HANDL

CALL WriteConsoleA@20

;Цикл ожиданий: движение мыши или нажатие ESC.

LOO:

;Координаты курсора.

MOV CRD.X,0

MOV CRD.Y,10

PUSH CRD

PUSH HANDL

CALL SetConsoleCursorPosition@8

;Прочитать одну запись о событии.

PUSH OFFSET CO ;Количество реально почитанных записей.

PUSH 1 ;Количество получаемых записей.

PUSH OFFSET MOUS_KEY ;Буфер для размещения записей.

PUSH HANDL1 ;Дескриптор входного буфера консоли.

CALL ReadConsoleInputA@16

;Проверим, не с мышью ли что?

CMP WORD PTR MOUS_KEY,MOUSE_EV

JNE LOO1

;Здесь преобразуем координаты мыши в строку.

MOV AX,WORD PTR MOUS_KEY+6 ;У - мышь.

;Копирование с обнулением старших битов.

MOVZX EAX,AX

PUSH EAX

MOV AX,WORD PTR MOUS_KEY+4 ;Х - мышь.

;Копирование с обнулением старших битов.

MOVZX EAX,AX

PUSH EAX

PUSH OFFSET FORM

PUSH OFFSET BUF

CALL wsprintfA

;Восстановить стек.

ADD ESP,16

;Перекодировать строку для вывода.

PUSH OFFSET BUF

PUSH OFFSET BUF

CALL CharToOemA@8

;Длина строки.

PUSH OFFSET BUF

CALL LENSTR

;Вывести на экран координаты курсора.

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET BUF

PUSH HANDL

CALL WriteConsoleA@20

JMP LOO ;К началу цикла.

LOO1:

;Нет ли события от клавиатуры?

CMP WORD PTR MOUS_KEY,KEY_EV

JNE LOO ;Есть, какое?

CMP BYTE PTR MOUS_KEY+14,27

JNE LOO

;*************************************

;Закрыть консоль.

CALL FreeConsole@0

PUSH 0

CALL ExitProcess@4

RET

;Процедура определения длины строки.

;Строка - [EBP+08H].

;Длина в ЕВХ

LENSTR PROC

ENTER 0,0

PUSH EAX

;----------------------

CLD

MOV EDI,DWORD PTR [EBP+08H]

MOV EBX,EDI

MOV ECX,100 ;Ограничить длину строки.

XOR AL,AL

REPNE SCASB ;Найти символ 0.

SUB EDI,EBX ;Длина строки, включая 0.

MOV EBX,EDI

DEC EBX

;----------------------

POP EAX

LEAVE

RET 4

LENSTR ENDP

_TEXT ENDS

END START