
- •Idi_application equ 32512
- •Idc_cross equ 32515
- •X word ?
- •Invoke Sleep, 5000
- •X word ?
- •Idi_application equ 32512
- •Idc_cross equ 32515
- •X dword ?
- •Xm dword ?
- •Xp dword ?
- •Idi_icon1 icon "calculator.Ico"
- •Idi_bit1 bitmap "picture1.Bmp"
- •Idi_bit2 bitmap "picture2.Bmp"
- •Idi_icon1 icon "calculator.Ico"
- •Xm dword ?
- •Xp dword ?
- •Idi_icon1 icon "calculator.Ico"
- •Vk_f5, 4, virtkey, alt
- •Xm dword ?
- •Xp dword ?
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
;ідентифікатор стандартної піктограми