Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .586P
- .MODEL FLAT,STDCALL
- ; константы
- ; сообщение приходит при закрытии окна
- WM_DESTROY equ 2
- ; сообщение приходит при создании окна
- WM_CREATE equ 1
- ; сообщение при щелчке левой кнопкой мыши в области окна
- WM_LBUTTONDOWN equ 201h
- ; сообщение при щелчке правой кнопкой мыши в области окна
- WM_RBUTTONDOWN equ 204h
- ; свойства окна
- CS_VREDRAW equ 1h
- CS_HREDRAW equ 2h
- CS_GLOBALCLASS equ 4000h
- WS_OVERLAPPEDWINDOW equ 000CF0000H
- style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
- ; идентификатор стандартной иконки
- IDI_APPLICATION equ 32512
- ; идентификатор курсора
- IDC_CROSS equ 32515
- ; режим показа окна - нормальный
- SW_SHOWNORMAL equ 1
- ;не удалять из очер
- PM_NOREMOVE equ 0h
- ; прототипы внешних процедур
- EXTERN MessageBoxA@16: NEAR
- EXTERN CreateWindowExA@48:NEAR
- EXTERN DefWindowProcA@16:NEAR
- EXTERN DispatchMessageA@4:NEAR
- EXTERN ExitProcess@4:NEAR
- EXTERN GetMessageA@16:NEAR
- EXTERN PeekMessageA@20:NEAR
- EXTERN GetModuleHandleA@4:NEAR
- EXTERN LoadCursorA@8:NEAR
- EXTERN LoadIconA@8:NEAR
- EXTERN PostQuitMessage@4:NEAR
- EXTERN RegisterClassA@4:NEAR
- EXTERN ShowWindow@8:NEAR
- EXTERN TranslateMessage@4:NEAR
- EXTERN UpdateWindow@4:NEAR
- include /masm32/include/user32.inc
- include /masm32/include/kernel32.inc
- includelib /masm32/lib/user32.lib
- includelib /masm32/lib/kernel32.lib
- ; структуры
- ; структура сообщения
- MSGSTRUCT STRUC
- MSHWND DD ? ; идентификатор окна,
- ; получающего сообщение
- MSMESSAGE DD ? ; идентификатор сообщения
- MSWPARAM DD ? ; доп. информация о сообщении
- MSLPARAM DD ? ; доп. информация о сообщении
- MSTIME DD ? ; время посылки сообщения
- MSPT DD ? ; положение курсора, во время посылки
- ; сообщения
- MSGSTRUCT ENDS
- ;---------
- WNDCLASS STRUC
- CLSSTYLE DD ? ; стиль окна
- CLWNDPROC DD ? ; указатель на процедуру окна
- CLSCEXTRA DD ? ; информация о доп. байтах для
- ; данной структуры
- CLWNDEXTRA DD ? ; информация о доп. байтах для окна
- CLSHINSTANCE DD ? ; дескриптор приложения
- CLSHICON DD ? ; идентификатор иконы окна
- CLSHCURSOR DD ? ; идентификатор курсора окна
- CLBKGROUND DD ? ; идентификатор кисти окна
- CLMENUNAME DD ? ; имя-идентификатор меню
- CLNAME DD ? ; специфицирует имя класса окон
- WNDCLASS ENDS
- _DATA SEGMENT
- msg_title db "Title", 0
- msg_message db "Hello world", 0
- HW DWORD ?
- NEWHWND DD 0
- MSG MSGSTRUCT <?>
- WC WNDCLASS <?>
- HINST DD 0 ; здесь хранится дескриптор приложения
- TITLENAME DB 'Простой пример 32-битного приложения',0
- CLASSNAME DB 'CLASS32',0
- CAP DB 'Сообщение',0
- MES1 DB 'Вы нажали левую кнопку мыши',0
- MES2 DB 'Выход из программы. Пока!',0
- _DATA ENDS
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- _TEXT SEGMENT
- START:
- ;PUSH 0
- ;PUSH OFFSET msg_title
- ;PUSH OFFSET msg_message
- ;PUSH HW
- ;CALL MessageBoxA@16
- ;invoke Beep, 100,1000
- ; получить дескриптор приложения
- PUSH 0
- CALL GetModuleHandleA@4
- MOV [HINST], EAX
- REG_CLASS:
- ; заполнить структуру окна стиль
- MOV [WC.CLSSTYLE], style
- ; процедура обработки сообщений
- MOV [WC.CLWNDPROC], OFFSET WNDPROC
- MOV [WC.CLSCEXTRA], 0
- MOV [WC.CLWNDEXTRA], 0
- MOV EAX, [HINST]
- MOV [WC.CLSHINSTANCE], EAX
- ;--------- иконка окна
- PUSH IDI_APPLICATION
- PUSH 0
- CALL LoadIconA@8
- MOV [WC.CLSHICON], EAX
- ;---------- курсор окна
- PUSH IDC_CROSS
- PUSH 0
- CALL LoadCursorA@8
- MOV [WC.CLSHCURSOR], EAX
- ;---------
- MOV [WC.CLBKGROUND], 17 ; цвет окна
- MOV DWORD PTR [WC.CLMENUNAME], 0
- MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
- PUSH OFFSET WC
- CALL RegisterClassA@4
- ; создать окно зарегистрированного класса
- PUSH 0
- PUSH [HINST]
- PUSH 0
- PUSH 0
- PUSH 400 ; DY — высота окна
- PUSH 400 ; DX - ширина окна
- PUSH 100 ; Y — координата левого верхнего угла
- PUSH 100 ; X — координата левого верхнего угла
- PUSH WS_OVERLAPPEDWINDOW
- PUSH OFFSET TITLENAME ; имя окна
- PUSH OFFSET CLASSNAME ; имя класса
- PUSH 0
- CALL CreateWindowExA@48
- ; проверка на ошибку
- CMP EAX, 0
- JZ _ERR
- MOV [NEWHWND], EAX ; дескриптор окна
- ; --------------------------------------------------
- PUSH SW_SHOWNORMAL
- PUSH [NEWHWND]
- CALL ShowWindow@8; показать созданное окно
- ; --------------------------------------------------
- ;PUSH [NEWHWND]
- ;CALL UpdateWindow@4 ; команда перерисовать видимую
- ;------------------------------------------------------
- ; цикл обработки сообщений
- MSG_LOOP:
- PUSH PM_NOREMOVE
- PUSH 0
- PUSH 0
- PUSH 0
- PUSH OFFSET MSG
- CALL PeekMessageA@20
- CMP EAX,0
- JZ NO_MES
- PUSH 0
- PUSH 0
- PUSH 0
- PUSH OFFSET MSG
- CALL GetMessageA@16
- CMP EAX, 0
- JE END_LOOP
- PUSH OFFSET MSG
- CALL TranslateMessage@4
- PUSH OFFSET MSG
- CALL DispatchMessageA@4
- JMP MSG_LOOP
- NO_MES:
- NOP
- NOP
- NOP
- JMP MSG_LOOP
- END_LOOP:
- ; выход из программы (закрыть процесс)
- PUSH [MSG.MSWPARAM]
- CALL ExitProcess@4
- _ERR:
- JMP END_LOOP
- ; --------------------------------------------------
- ; процедура окна
- ; расположение параметров в стеке
- ; [EBP+014H] LPARAM
- ; [EBP+10H] WAPARAM
- ; [EBP+0CH] MES
- ; [EBP+8] HWND
- WNDPROC PROC
- PUSH EBP
- MOV EBP, ESP
- PUSH EBX
- PUSH ESI
- PUSH EDI
- CMP DWORD PTR [EBP+0CH], WM_DESTROY
- JE WMDESTROY
- CMP DWORD PTR [EBP+0CH], WM_CREATE
- JE WMCREATE
- CMP DWORD PTR [EBP+0CH] ,WM_LBUTTONDOWN ;левая кнопка
- JE LBUTTON
- CMP DWORD PTR [EBP+0CH] ,WM_RBUTTONDOWN ;правая кнопка
- JE RBUTTON
- JMP DEFWNDPROC
- ; нажатие правой кнопки приводит к закрытию окна
- RBUTTON:
- JMP WMDESTROY
- ; нажатие левой кнопки мыши
- LBUTTON:
- ; выводим сообщение
- PUSH 0 ; МВ_ОК
- PUSH OFFSET CAP
- PUSH OFFSET MES1
- PUSH DWORD PTR [EBP+08H]
- CALL MessageBoxA@16
- MOV EAX, 0
- JMP FINISH
- WMCREATE:
- MOV EAX, 0
- JMP FINISH
- DEFWNDPROC:
- PUSH DWORD PTR [EBP+14H]
- PUSH DWORD PTR [EBP+10H]
- PUSH DWORD PTR [EBP+0CH]
- PUSH DWORD PTR [EBP+08H]
- CALL DefWindowProcA@16
- JMP FINISH
- WMDESTROY:
- PUSH 0 ; МВ_ОК
- PUSH OFFSET CAP
- PUSH OFFSET MES2
- PUSH DWORD PTR [EBP+08H] ; дескриптор окна
- CALL MessageBoxA@16
- ;отправить WM_QUIT сам себе
- PUSH 0
- CALL PostQuitMessage@4 ; сообщение WM_QUIT
- MOV EAX, 0
- FINISH:
- POP EDI
- POP ESI
- POP EBX
- POP EBP
- RET 16
- WNDPROC ENDP
- _TEXT ENDS
- END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement