Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsiyi.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
188.29 Кб
Скачать

Invoke Sleep, 5000

CALL FreeConsole@0

CALL ExitProcess@4

; рядок - [EBP+08H]

; довжина в EBX

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

;подія

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 l0h

NUMLOCK_ON equ 20h

SCROLLLOCK_DN equ 40h

CAPSLOCK_ON equ 80h

ENHANCED_KEY equ l00h

MOUSE_MOV equ 1h

DOUBLE_CL equ 2h

; константи

STD_OUTPUT_HANDLE equ -11

STD_INPUT_HANDLE equ -10

; атрибути кольорів

FOREGROUND_BLUE equ 1h

FOREGROUND_GREEN equ 2h

FOREGROUND_RED equ 4h

FOREGROUND_INTENSITY equ 8h

BACKGROUND_BLUE equ 10h

BACKGROUND_GREEN equ 20h

BACKGROUND_RED equ 40h

BACKGROUND_INTENSITY equ 80h

COL1 = 1h+2h+8h+10h

COL2 = 4h+2h+8h+40h

; прототипи зовнішніх процедур

EXTERN GetStdHandle@4:NEAR

EXTERN wsprintfA:NEAR

; директиви для подключення бібліотек

includelib c:\masm32\lib\user32.lib

includelib c:\masm32\lib\kernel32.lib

include c:\masm32\include\kernel32.inc

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

COOR STRUC

X word ?

Y WORD ?

COOR ENDS

; сегмент данних

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

HANDL DWORD ?

HANDL1 DWORD ?

STR2 DB "Enter word: ",0

STR3 DB "Press ESC to exit", 0

STR1 DB "Лабораторна робота №4",0

FORM DB "Coordinates: %u %u ",0

BUF DB 200 dup (?)

LENS DWORD ? ; кількість символів, що вводяться

CRD COOR <?>

EVENT DB 18 DUP(?)

SLOVO DWORD ?

_DATA ENDS

; сегмент кода

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; кодування рядка

PUSH OFFSET STR1

PUSH OFFSET STR1

CALL CharToOemA@8

; кодування рядка

PUSH OFFSET STR2

PUSH OFFSET STR2

CALL CharToOemA@8

; кодування рядка

PUSH OFFSET STR3

PUSH OFFSET STR3

CALL CharToOemA@8

; створення консолі

; звільнення консолі

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

; встановлення розмірів консолі

MOV CRD.X, 50

MOV CRD.Y, 50

PUSH CRD

PUSH EAX

CALL SetConsoleScreenBufferSize@8

; задання заголовку консолі

PUSH OFFSET STR1

CALL SetConsoleTitleA@4

; задати атрибути кольору видимого тексту

PUSH COL1

PUSH HANDL

CALL SetConsoleTextAttribute@8

; позиція курсора

MOV CRD.X,0

MOV CRD.Y,0

PUSH CRD

PUSH HANDL

CALL SetConsoleCursorPosition@8

; виведення рядка

PUSH OFFSET STR3

CALL LENSTR ; в EBX довжина рядка

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET STR3

PUSH HANDL

CALL WriteConsoleA@20

; позиція курсора

MOV CRD.X,0

MOV CRD.Y,1

PUSH CRD

PUSH HANDL

CALL SetConsoleCursorPosition@8

; виведення рядка

PUSH OFFSET STR2

CALL LENSTR ; в EBX довжина рядка

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET STR2

PUSH HANDL

CALL WriteConsoleA@20

; чекати виведення консолі

PUSH 0

PUSH OFFSET LENS

PUSH 200

PUSH OFFSET BUF

PUSH HANDL1

CALL ReadConsoleA@20

L00:

; отримання інформації про подію

PUSH OFFSET SLOVO

PUSH 1

PUSH OFFSET EVENT

PUSH HANDL1

CALL ReadConsoleInputA@16

CMP WORD PTR EVENT, MOUSE_EV

JNE L001

CMP BYTE PTR EVENT+16, MOUSE_EV

JE DOUBLE

JMP L00

DOUBLE:

MOV BX,WORD PTR EVENT+4 ;X

MOV CRD.X,BX

MOV AX,WORD PTR EVENT+6 ;Y

MOV CRD.Y,AX

PUSH CRD

PUSH HANDL

CALL SetConsoleCursorPosition@8

; виведення рядка

PUSH OFFSET BUF

CALL LENSTR ; в EBX довжина рядка

PUSH 0

PUSH OFFSET LENS

PUSH EBX

PUSH OFFSET BUF

PUSH HANDL

CALL WriteConsoleA@20

JMP L00

L001:

; перевірка події

CMP BYTE PTR EVENT,KEY_EV

JNE L00

; перевірка нажаття кнопки

CMP BYTE PTR EVENT+14,27

JNE L00

CALL FreeConsole@0

PUSH 0

CALL ExitProcess@4

; рядок - [EBP+08H]

; довжина в EBX

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

;директиви компонувальнику для підключення бібліотек

includelib C:\masm32\lib\user32.lib

includelib C:\masm32\lib\kernel32.lib

includelib C:\masm32\lib\gdi32.lib

includelib C:\masm32\lib\masm32.lib

;константи

WM_DESTROY equ 2

WM_CREATE equ 1

WM_LBUTTONDOWN equ 201h

WM_RBUTTONDOWN equ 204h

WM_PAINT equ 0Fh

WM_COMMAND equ 111h

;властивості вікна

CS_VREDRAW equ 1h

CS_HREDRAW equ 2h

CS_GLOBALCLASS equ 4000h

WS_OVERLAPPEDWINDOW equ 000CF0000H

style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS

;ідентифікатор стандартної піктограми

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]