Хорошо там, где нас нет. Но мы обязательно будем. ©// Адепт Халявства.//
О, боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже-боже!!!!! Почему я такой мудак?!! Почему протянул весь семестр и не установил нормлаьный компилятор себе на компьютер?! Т____Т
Завтра сдавать курсовой. Я даже написал прогрумму...Только мешает одно НО!! Т.к. я не могу ее скомпелировать я не могу проверить ее работоспособность и вычислить баги!!!! ААААаааааааа!! ЗА ЧТО?!!! ЗА ЧТО ТЫ СДЕЛАЛ МЕНЯ ТАКИМ ДУРАКОМ, ГОСПОДИ??
Говорят дуракам везет...Так пусть же мне повезет и заработает завтра мое детище!!мое детище!!
; файл console.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
; константы дескрипторов буфера
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
; структура координат
COORD STRUC
X DW ?
Y DW ?
COORD ENDS
;Цвет окна консоли
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 ; повышенная интенсивность
; тип события
KEY_EV equ 1h ; клавиатурное событие
MOUSE_EV equ 2h ; событие с мышью
WINDOW_BUFFER_SIZE_EV equ 4h ; изменился размер окна
MENU_EV equ 8h ; зарезервировано
FOCUS_EV equ 10h ; зарезервировано
; константы - состояния клавиатуры
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
;события мыши
MOUSE_MOVED equ 1h; было движение мыши
DOUBLE_CLICK equ 2h; был двойной щелчок
;описание событий структуры PINPUT_RECORD
;событие мыши
MOUSE_EVENT_RECORD STRUCT
dwMousePosition COORD <>
dwButtonState DWORD ?
dwControlKeyState DWORD ?
dwEventFlags DWORD ?
MOUSE_EVENT_RECORD ENDS
;событие клавиатуры
KEY_EVENT_RECORD STRUCT
bKeyDown DD ?
wRepeatCount DW ?
wVirtualKeyCode DW ?
wVirtualScanCode DW ?
UNION
UnicodeChar DW ?
AsciiChar DB ?
ENDS
dwControlKeyState DD ?
KEY_EVENT_RECORD ENDS
;изменение размера окна консоли
WINDOW_BUFFER_SIZE_RECORD STRUCT
dwSize COORD <>
WINDOW_BUFFER_SIZE_RECORD ENDS
MENU_EVENT_RECORD STRUCT
dwCommandId DWORD ?
MENU_EVENT_RECORD ENDS
FOCUS_EVENT_RECORD STRUCT
bSetFocus DWORD ?
FOCUS_EVENT_RECORD ENDS
;Структура PINPUT_RECORD
INPUT_RECORD STRUCT
EventType DW ?
DW ?
UNION
KeyEvent KEY_EVENT_RECORD <>
MouseEvent MOUSE_EVENT_RECORD <>
WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <>
MenuEvent MENU_EVENT_RECORD <>
FocusEvent FOCUS_EVENT_RECORD <>
ENDS
INPUT_RECORD ENDS
; Секция данных содержит временные переменные
.data
Numi dd ? ; целая часть числа
tol dd 10000 ; точность
corr dd 0.00001 ; коррекция «лукавого знака»
cw dw ? ; управление округлением
@CO DD ?
@numBytes DD ?
KeyEvent INPUT_RECORD <>
@SYMBOL DB ?
.code
;-------------------------------------------------------------------
; Функция считывание символа в консоли
; consoleInHandle - дескриптор буфера консоли ввода
; consoleOutHandle - дескриптор буфера консоли вывода
; Display - управление отображением символа:
; 0 - символ отображается
; 1 - символ не отображается
; функция возвращает считанный символ в регистре al
ReadSymbol proc consoleInHandle
WORD, consoleOutHandle
WORD, Display
WORD
@L1:
INVOKE ReadConsoleInputA,
consoleInHandle,
offset KeyEvent,
1,
offset @CO
CMP KeyEvent.EventType,KEY_EV
JNE @L1
; сохранение введенного символа
MOV AL, KeyEvent.KeyEvent.AsciiChar
MOV @SYMBOL, AL
CMP Display,0
JNE @L2
;вывод символа
INVOKE WriteConsoleA,
consoleOutHandle,
OFFSET @SYMBOL,
1,
OFFSET @numBytes,
0
; Считывание события клавиатуры отпускания клавиши
@L2:
INVOKE ReadConsoleInputA,
consoleInHandle,
offset KeyEvent,
1,
offset @CO
CMP KeyEvent.EventType,KEY_EV
JNE @L2
mov eax,0
mov al, @SYMBOL
ret
ReadSymbol endp
;-------------------------------------------------------------------
;Представление целого числа в текстовой форме
; Number - целое число
; Str1 - указатель на строку, в которую будет помещено представление числа
; функция возвращает длину строки символов в регистре EAX
IntToStr proc Number
WORD, Str1
WORD
MOV EAX, Number
MOV EDI,Str1
MOV ECX, 0
CMP EAX,0
JGE @I1
MOV DL, '-'
MOV [EDI],DL
INC EDI
NOT EAX
INC EAX
@I1:
MOV EBX, 10
MOV EDX, 0
IDIV EBX
PUSH EDX
INC ECX
CMP EAX,0
JG @I1
; MOV EBX,ECX
@I2:
POP EDX
ADD DL, 30h
MOV [EDI],DL
INC EDI
LOOP @I2
MOV DL,0
MOV [EDI], DL
INC EDI
MOV EAX, EDI
SUB EAX, Str1
ret
IntToStr endp
;-------------------------------------------------------------------
;Определение длины строки
;Str1 - указатель на строку
; функция возвращает длину строки символов в регистре EAX
LENSTR PROC Str1
WORD
CLD
CLD
MOV EDI, Str1
MOV EBX,EDI
MOV ECX,100 ; ограничить длину строки
MOV EAX, 0
REPNE SCASB ; найти символ 0
SUB EDI, EBX ; длина строки, включая 0
MOV EAX,EDI
DEC EAX
RET
LENSTR ENDP
;-------------------------------------------------------------------
; Вывод строки в окно консоли
; StrPtr - указатель на выводимую строку, оканчивающуюся 0
; consoleOutHandle - дескриптор буфера консоли вывода
PrintStr proc StrPtr
WORD, Handle
WORD
INVOKE CharToOem, StrPtr, StrPtr
INVOKE LENSTR, StrPtr ; определение длины строки
INVOKE WriteConsole,
Handle,
StrPtr,
eax,
OFFSET @numBytes, 0
ret
PrintStr endp
FloatToStr proc Num
WORD, strr
WORD
fstcw cw
or cw, 0C00h
fldcw cw
mov edi, strr
mov ecx, 20
@F0: mov byte ptr [edi],0
inc edi
loop @F0
mov edi, strr
fld Num
fadd corr
fldz
fcomip ST, ST(1)
jb @F1
mov byte ptr [edi],'-'
inc edi
@F1: fsub corr
fabs
fadd corr
fist Numi
INVOKE IntToStr, Numi, edi
dec edi
mov bl,'.'
mov [edi],bl
inc edi
fild Numi
fsubrp
fabs
fimul tol
fistp Numi
push tol
push corr
mov corr, 10
@F2: mov edx,0 ; определение количества нулей после точки
mov eax, tol
idiv corr
mov tol, eax
cmp Numi, eax
jge @F3
mov byte ptr [edi],'0'
inc edi
cmp tol, 1
jg @F2
cmp Numi, 0
je @F4
@F3: INVOKE IntToStr, Numi, edi
@F4: pop corr
pop tol
ret
FloatToStr endp
; Файл win.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\shlwapi.inc
; стандартные дескрипторы окна
IDI_APPLICATION = 32512
IDI_HAND = 32513
IDI_QUESTION = 32514
IDI_EXCLAMATION = 32515
IDI_ASTERISK = 32516
;стандартные дескрипторы курсора
IDC_ARROW = 32512
IDC_IBEAM = 32513
IDC_WAIT = 32514
IDC_CROSS = 32515
IDC_UPARROW = 32516
IDC_SIZE = 32640
IDC_ICON = 32641
IDC_SIZENWSE = 32642
IDC_SIZENESW = 32643
IDC_SIZEWE = 32644
IDC_SIZENS = 32645
; свойства окна
CS_VREDRAW = 0001h
CS_HREDRAW = 0002h
CS_KEYCVTWINDOW = 0004H
CS_DBLCLKS = 0008h
CS_OWNDC = 0020h
CS_CLASSDC = 0040h
CS_PARENTDC = 0080h
CS_NOKEYCVT = 0100h
CS_SAVEBITS = 0800h
CS_NOCLOSE = 0200h
CS_BYTEALIGNCLIENT = 1000h
CS_BYTEALIGNWINDOW = 2000h
CS_GLOBALCLASS = 4000h
; цвет кисти
WHITE_BRUSH =0 ;прозрачное окно
LTGRAY_BRUSH =1
GRAY_BRUSH =2
DKGRAY_BRUSH =3
BLACK_BRUSH =4
NULL_BRUSH =5 ; привычный цвет окна
HOLLOW_BRUSH =5
; структура
WNDCLASS STRUCT
style DD ?
lpfnWndProc DD ?
cbClsExtra DD 0
cbWndExtra DD 0
hInstance DD ?
hIcon DD ?
hCursor DD ?
hbrBackground DD ?
lpszMenuName DD 0
lpszClassName DD ?
WNDCLASS ENDS
; тип окна
WS_OVERLAPPED =000000000h
WS_ICONICPOPUP =0C0000000h
WS_POPUP =080000000h
WS_CHILD =040000000h
WS_MINIMIZE =020000000h
WS_VISIBLE =010000000h
WS_DISABLED =008000000h
WS_CLIPSIBLINGS =004000000h
WS_CLIPCHILDREN =002000000h
WS_MAXIMIZE =001000000h
WS_CAPTION =000C00000h ;WS_BORDER | WS_DLGFRAME
WS_BORDER =000800000h
WS_DLGFRAME =000400000h
WS_VSCROLL =000200000h
WS_HSCROLL =000100000h
WS_SYSMENU =000080000h
WS_THICKFRAME =000040000h
WS_HREDRAW =000020000h
WS_VREDRAW =000010000h
WS_GROUP =000020000h
WS_TABSTOP =000010000h
WS_MINIMIZEBOX =000020000h
WS_MAXIMIZEBOX =000010000h
; отображение окна
SW_HIDE =0
SW_SHOWNORMAL =1
SW_NORMAL =1
SW_SHOWMINIMIZED =2
SW_SHOWMAXIMIZED =3
SW_MAXIMIZE =3
SW_SHOWNOACTIVATE =4
SW_SHOW =5
SW_MINIMIZE =6
SW_SHOWMINNOACTIVE =7
SW_SHOWNA =8
SW_RESTORE =9
; Типы сообщений
WM_NULL equ 0h
WM_CREATE equ 1h
WM_DESTROY equ 2h
WM_MOVE equ 3h
WM_SIZE equ 5h
WM_ACTIVATE equ 6h
WM_SETFOCUS equ 7h
WM_KILLFOCUS equ 08h
WM_ENABLE equ 0Ah
WM_SETREDRAW equ 0Bh
WM_SETTEXT equ 0Ch
WM_GETTEXT equ 0Dh
WM_GETTEXTLENGTH equ 0Eh
WM_PAINT equ 0Fh
WM_CLOSE equ 10h
WM_QUIT equ 12h
WM_KEYFIRST equ 100h
WM_KEYDOWN equ 100h
WM_KEYUP equ 101h
WM_CHAR equ 102h
WM_INITDIALOG equ 110h
WM_COMMAND equ 111h
WM_SYSCOMMAND equ 112h
WM_TIMER equ 113h
WM_HSCROLL equ 114h
WM_VSCROLL equ 115h
WM_MOUSEMOVE equ 200h
WM_LBUTTONDOWN equ 201h
WM_LBUTTONUP equ 202h
WM_LBUTTONDBLCLK equ 203h
WM_RBUTTONDOWN equ 204h
WM_RBUTTONUP equ 205h
WM_RBUTTONDBLCLK equ 206h
WM_MBUTTONDOWN equ 207h
WM_MBUTTONUP equ 208h
WM_MBUTTONDBLCLK equ 209h
WM_WINDOWPOSCHANGING equ 46h
WM_WINDOWPOSCHANGED equ 47h
WM_SIZING equ 214h
; структура сообщения
POINT STRUCT
x DD ?
y DD ?
POINT ENDS
MSG STRUCT
hwnd DD ?
message DD ?
wParam DD ?
lParam DD ?
time DD ?
pt POINT <>
MSG ENDS
PAINTSTRUCT STRUCT
hdc DWORD 0 ; дескриптор контекста окна
fErase DWORD 0 ; 1 – стирать фон, 0 – оставить фон окна
left DWORD 0 ; левый
top DWORD 0 ; верхний
right DWORD 0 ; правый
bottom DWORD 0 ; нижний угол прямоугольника для перерисовки
fRes DWORD 0 ; резервный, используется системой
fIncUp DWORD 0 ; резервный, используется системой
Reserv DB 32 dup(0) ; резервный, используется системой
PAINTSTRUCT ENDS
RECT STRUCT
left dd 0
top dd 0
right dd 0
bottom dd 0
RECT ENDS
SRCCOPY equ 0CC0020h
SRCPAINT equ 0EE0086h
SRCAND equ 8800C6h
SRCINVERT equ 660046h
SRCERASE equ 440328h
PATCOPY equ 0F00021h
PATPAINT equ 0FB0A09h
PATINVERT equ 5A0049h
DSTINVERT equ 550009h
BLACKNESS equ 42h
WHITENESS equ 0FF0062h
PS_SOLID equ 0
PS_DASH equ 1
PS_DOT equ 2
PS_DASHDOT equ 3
PS_DASHDOTDOT equ 4
PS_NULL equ 5
PS_INSIDEFRAME equ 6
PS_USERSTYLE equ 7
PS_ALTERNATE equ 8
PS_STYLE_MASK equ 0Fh
PS_ENDCAP_ROUND equ 0h
PS_ENDCAP_SQUARE equ 100h
PS_ENDCAP_FLAT equ 200h
PS_ENDCAP_MASK equ 0F00h
PS_JOIN_ROUND equ 0h
PS_JOIN_BEVEL equ 1000h
PS_JOIN_MITER equ 2000h
PS_JOIN_MASK equ 0F000h
PS_COSMETIC equ 0h
PS_GEOMETRIC equ 10000h
PS_TYPE_MASK equ 0F0000h
SM_CXSCREEN equ 0
SM_CYSCREEN equ 1
SM_CXVSCROLL equ 2
SM_CYHSCROLL equ 3
SM_CYCAPTION equ 4
SM_CXBORDER equ 5
SM_CYBORDER equ 6
SM_CXDLGFRAME equ 7
SM_CYDLGFRAME equ 8
SM_CYVTHUMB equ 9
SM_CXHTHUMB equ 10
SM_CXICON equ 11
SM_CYICON equ 12
SM_CXCURSOR equ 13
SM_CYCURSOR equ 14
SM_CYMENU equ 15
SM_CXFULLSCREEN equ 16
SM_CYFULLSCREEN equ 17
SM_CYKANJIWINDOW equ 18
SM_MOUSEPRESENT equ 19
SM_CYVSCROLL equ 20
SM_CXHSCROLL equ 21
SM_DEBUG equ 22
SM_SWAPBUTTON equ 23
SM_RESERVED1 equ 24
SM_RESERVED2 equ 25
SM_RESERVED3 equ 26
SM_RESERVED4 equ 27
SM_CXMIN equ 28
SM_CYMIN equ 29
SM_CXSIZE equ 30
SM_CYSIZE equ 31
SM_CXFRAME equ 32
SM_CYFRAME equ 33
SM_CXMINTRACK equ 34
SM_CYMINTRACK equ 35
SM_CXDOUBLECLK equ 36
SM_CYDOUBLECLK equ 37
SM_CXICONSPACING equ 38
SM_CYICONSPACING equ 39
SM_MENUDROPALIGNMENT equ 40
SM_PENWINDOWS equ 41
SM_DBCSENABLED equ 42
SM_CMOUSEBUTTONS equ 43
SM_CXFIXEDFRAME equ SM_CXDLGFRAME
SM_CYFIXEDFRAME equ SM_CYDLGFRAME
SM_CXSIZEFRAME equ SM_CXFRAME
SM_CYSIZEFRAME equ SM_CYFRAME
SM_SECURE equ 44
SM_CXEDGE equ 45
SM_CYEDGE equ 46
SM_CXMINSPACING equ 47
SM_CYMINSPACING equ 48
SM_CXSMICON equ 49
SM_CYSMICON equ 50
SM_CYSMCAPTION equ 51
SM_CXSMSIZE equ 52
SM_CYSMSIZE equ 53
SM_CXMENUSIZE equ 54
SM_CYMENUSIZE equ 55
SM_ARRANGE equ 56
SM_CXMINIMIZED equ 57
SM_CYMINIMIZED equ 58
SM_CXMAXTRACK equ 59
SM_CYMAXTRACK equ 60
SM_CXMAXIMIZED equ 61
SM_CYMAXIMIZED equ 62
SM_NETWORK equ 63
SM_CLEANBOOT equ 67
SM_CXDRAG equ 68
SM_CYDRAG equ 69
SM_SHOWSOUNDS equ 70
SM_CXMENUCHECK equ 71
SM_CYMENUCHECK equ 72
SM_SLOWMACHINE equ 73
SM_MIDEASTENABLED equ 74
SM_MOUSEWHEELPRESENT equ 75
SM_CMETRICS equ 75
SM_XVIRTUALSCREEN equ 76
SM_YVIRTUALSCREEN equ 77
SM_CXVIRTUALSCREEN equ 78
SM_CYVIRTUALSCREEN equ 79
SM_CMONITORS equ 80
; файл с текстом программы
.586
.MODEL FLAT, stdcall
RGBW equ 00CCCCCCh ; цвет фона окна
include win.inc
include console.inc
.data
HWND DD 0 ; дескриптор главного окна
HINST DD 0 ; дескриптор приложения
TITL DB "Программа",0
CLASSNAME DB 'CLASS32',0
Message MSG <?>
WC WNDCLASS <?>
CPBUT db 'Рассчитать',0
CLSBTN db 'BUTTON',0
CLSEDT db 'EDIT',0
CAP db 'Сообщение',0
TEXTA db 20 dup(0) ; текст в полях редактирования
TEXTB db 20 dup(0)
TEXTC db 20 dup(0)
x dd 0
y dd 0
k dd 0
hBut DD ? ; дескриптор кнопки
hedt1 DD ? ; дескриптор поля 1
hedt2 DD ? ; дескриптор поля 2
hedt3 DD ? ;дескриптор поля 3
hdc DD ? ; дескриптор контекста окна
ps PAINTSTRUCT <?>
mess1 db 'Вычислить четверть',0 ; надпись в окне
mess1_len equ $-mess1-1
mess2 db '=',10 dup(' '),0 ; результат суммы строковый
sum_len equ $-mess2-1
.code
START proc
; получить дескриптор приложения
INVOKE GetModuleHandle, 0
MOV HINST, EAX
; заполнить структуру окна стиль
MOV WC.style, CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
; процедура обработки сообщений
MOV WC.lpfnWndProc, OFFSET WNDPROC
MOV EAX, HINST
MOV WC.hInstance, EAX
INVOKE LoadIcon, 0, IDI_APPLICATION
MOV WC.hIcon, EAX
INVOKE LoadCursor, 0, IDC_ARROW
MOV WC.hCursor, EAX
INVOKE CreateSolidBrush, RGBW
MOV WC.hbrBackground, EAX
MOV DWORD PTR WC.lpszMenuName, 0
MOV DWORD PTR WC.lpszClassName, OFFSET CLASSNAME
INVOKE RegisterClass, OFFSET WC
; создать окно зарегистрированного класса
INVOKE CreateWindowEx, 0,
OFFSET CLASSNAME,
OFFSET TITL,
WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_GROUP + WS_TABSTOP,
100, ; X — координата левого верхнего угла
100, ; Y — координата левого верхнего угла
400, ; DX - ширина окна
450, ; DY — высота окна
0, 0, HINST,0
CMP EAX, 0 ; проверка на ошибку
JZ END_LOOP
MOV HWND, EAX ; дескриптор окна
INVOKE ShowWindow, HWND, SW_SHOWNORMAL ; показать созданное окно
INVOKE UpdateWindow, HWND ;перерисовать видимую часть окна
;-------------------------------------------------------------------
; цикл обработки сообщений
MSG_LOOP:
INVOKE GetMessage, OFFSET Message, 0,0,0
CMP EAX, 0
JE END_LOOP
INVOKE TranslateMessage, OFFSET Message
INVOKE DispatchMessageA, OFFSET Message
JMP MSG_LOOP
END_LOOP:
INVOKE ExitProcess, Message.wParam ; выход из программы
START endp
; --------------------------------------------------
; процедура окна
WNDPROC PROC hW
WORD, Mes
WORD, wParam
WORD, lParam
WORD
CMP Mes, WM_DESTROY
JE WMDESTROY
CMP Mes, WM_CREATE
JE WMCREATE
CMP Mes, WM_COMMAND
JE WMCOMMAND
CMP Mes, WM_PAINT
JE WMPAINT
JMP DEFWNDPROC
;------------------------------------------------------------------
WMCREATE: ; создание окна
INVOKE CreateWindowExA, 0, ; поле редактирования 1
offset CLSEDT, ;имя класса окна
offset TEXTA, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
10, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt1,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt1, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; поле редактирования 2
offset CLSEDT, ;имя класса окна
offset TEXTB, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
90, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt2,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt2, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; поле редактирования 3
offset CLSEDT, ;имя класса окна
offset TEXTC, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
170, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt3,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt3, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; кнопка
offset CLSBTN, ;имя класса окна
offset CPBUT, ;надпись на кнопке
WS_CHILD+WS_VISIBLE, ;стиль окна кнопки
10, 90, ;x, y
100, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hBut,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hBut, SW_SHOWNORMAL
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
WMCOMMAND: ; обработка нажатия кнопки
mov eax, hBut
cmp lParam,eax
jne COM_END ; команда не соответствует нажатию кнопки
INVOKE SendMessage, hedt1, WM_GETTEXT, 20, offset TEXTA
INVOKE SendMessage, hedt2, WM_GETTEXT, 20, offset TEXTB
INVOKE SendMessage, hedt3, WM_GETTEXT, 20, offset TEXTC
INVOKE StrToInt, offset TEXTA
mov k, eax
INVOKE StrToInt, offset TEXTB
mov x,eax
INVOKE StrToInt, offset TEXTC
mov y,eax
mov eax,x
mov ebx,y
cmp x,0
JL xl ; // сравниваем х с нулем. Если меньше переходит на метку, если нет пере
cmp y,0
JL y2 ; //сравниваем y с нулем. если меньше уходит на ответ 2
JMP y4 ; // переходит на ответ 1
xl: cmp y,0
JL y1 ; // сравниваем у с нулем, если отрицательное переход на ответ 3
JMP y3 ; // Положительное у, переход на ответ 4
y4: mov eax,1
mov k,eax
JMP end1
y3: mov eax,4
mov k,eax
JMP end1
y2: mov eax,2
mov k,eax
JMP end1
y1: mov eax,3
mov k,eax
end1:
mov eax, sum_len
INVOKE TextOutA, ; стирание строки результата в окне
hdc, 180, 50, offset mess2, eax
INVOKE IntToStr, k, offset mess2+1
INVOKE LENSTR, offset mess2 ; определение длины результата
push eax
INVOKE TextOutA, ; вывод результата
hdc, 300, 50, offset mess2, eax
pop ecx ; очистка строки
inc ecx
mov al,' '
mov edi, offset mess2+1
CLR: mov [edi],al
inc edi
loop CLR
COM_END:
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
WMPAINT: ; перерисовка окна
INVOKE BeginPaint, hW, offset ps
mov hdc,eax
INVOKE SetBkColor, hdc, RGBW
mov eax, mess1_len
INVOKE TextOutA, hdc, 10, 20, offset mess1, eax
INVOKE EndPaint, hdc, offset ps
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
DEFWNDPROC: ; обработка сообщения по умолчанию
INVOKE DefWindowProc,
hW, Mes, wParam, lParam
JMP FINISH
;------------------------------------------------------------------
WMDESTROY: ; выход из цикла обработки сообщений
INVOKE PostQuitMessage, 0
MOV EAX, 0
FINISH: ret
WNDPROC ENDP
END START
З.Ы. ЫЫЫЫЫЫЫЫЫыыыыыыыы.... *ушел вешаться на люстре*
Завтра сдавать курсовой. Я даже написал прогрумму...Только мешает одно НО!! Т.к. я не могу ее скомпелировать я не могу проверить ее работоспособность и вычислить баги!!!! ААААаааааааа!! ЗА ЧТО?!!! ЗА ЧТО ТЫ СДЕЛАЛ МЕНЯ ТАКИМ ДУРАКОМ, ГОСПОДИ??
Говорят дуракам везет...Так пусть же мне повезет и заработает завтра мое детище!!мое детище!!
; файл console.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
; константы дескрипторов буфера
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
STD_ERROR_HANDLE equ -12
; структура координат
COORD STRUC
X DW ?
Y DW ?
COORD ENDS
;Цвет окна консоли
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 ; повышенная интенсивность
; тип события
KEY_EV equ 1h ; клавиатурное событие
MOUSE_EV equ 2h ; событие с мышью
WINDOW_BUFFER_SIZE_EV equ 4h ; изменился размер окна
MENU_EV equ 8h ; зарезервировано
FOCUS_EV equ 10h ; зарезервировано
; константы - состояния клавиатуры
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
;события мыши
MOUSE_MOVED equ 1h; было движение мыши
DOUBLE_CLICK equ 2h; был двойной щелчок
;описание событий структуры PINPUT_RECORD
;событие мыши
MOUSE_EVENT_RECORD STRUCT
dwMousePosition COORD <>
dwButtonState DWORD ?
dwControlKeyState DWORD ?
dwEventFlags DWORD ?
MOUSE_EVENT_RECORD ENDS
;событие клавиатуры
KEY_EVENT_RECORD STRUCT
bKeyDown DD ?
wRepeatCount DW ?
wVirtualKeyCode DW ?
wVirtualScanCode DW ?
UNION
UnicodeChar DW ?
AsciiChar DB ?
ENDS
dwControlKeyState DD ?
KEY_EVENT_RECORD ENDS
;изменение размера окна консоли
WINDOW_BUFFER_SIZE_RECORD STRUCT
dwSize COORD <>
WINDOW_BUFFER_SIZE_RECORD ENDS
MENU_EVENT_RECORD STRUCT
dwCommandId DWORD ?
MENU_EVENT_RECORD ENDS
FOCUS_EVENT_RECORD STRUCT
bSetFocus DWORD ?
FOCUS_EVENT_RECORD ENDS
;Структура PINPUT_RECORD
INPUT_RECORD STRUCT
EventType DW ?
DW ?
UNION
KeyEvent KEY_EVENT_RECORD <>
MouseEvent MOUSE_EVENT_RECORD <>
WindowBufferSizeEvent WINDOW_BUFFER_SIZE_RECORD <>
MenuEvent MENU_EVENT_RECORD <>
FocusEvent FOCUS_EVENT_RECORD <>
ENDS
INPUT_RECORD ENDS
; Секция данных содержит временные переменные
.data
Numi dd ? ; целая часть числа
tol dd 10000 ; точность
corr dd 0.00001 ; коррекция «лукавого знака»
cw dw ? ; управление округлением
@CO DD ?
@numBytes DD ?
KeyEvent INPUT_RECORD <>
@SYMBOL DB ?
.code
;-------------------------------------------------------------------
; Функция считывание символа в консоли
; consoleInHandle - дескриптор буфера консоли ввода
; consoleOutHandle - дескриптор буфера консоли вывода
; Display - управление отображением символа:
; 0 - символ отображается
; 1 - символ не отображается
; функция возвращает считанный символ в регистре al
ReadSymbol proc consoleInHandle



@L1:
INVOKE ReadConsoleInputA,
consoleInHandle,
offset KeyEvent,
1,
offset @CO
CMP KeyEvent.EventType,KEY_EV
JNE @L1
; сохранение введенного символа
MOV AL, KeyEvent.KeyEvent.AsciiChar
MOV @SYMBOL, AL
CMP Display,0
JNE @L2
;вывод символа
INVOKE WriteConsoleA,
consoleOutHandle,
OFFSET @SYMBOL,
1,
OFFSET @numBytes,
0
; Считывание события клавиатуры отпускания клавиши
@L2:
INVOKE ReadConsoleInputA,
consoleInHandle,
offset KeyEvent,
1,
offset @CO
CMP KeyEvent.EventType,KEY_EV
JNE @L2
mov eax,0
mov al, @SYMBOL
ret
ReadSymbol endp
;-------------------------------------------------------------------
;Представление целого числа в текстовой форме
; Number - целое число
; Str1 - указатель на строку, в которую будет помещено представление числа
; функция возвращает длину строки символов в регистре EAX
IntToStr proc Number


MOV EAX, Number
MOV EDI,Str1
MOV ECX, 0
CMP EAX,0
JGE @I1
MOV DL, '-'
MOV [EDI],DL
INC EDI
NOT EAX
INC EAX
@I1:
MOV EBX, 10
MOV EDX, 0
IDIV EBX
PUSH EDX
INC ECX
CMP EAX,0
JG @I1
; MOV EBX,ECX
@I2:
POP EDX
ADD DL, 30h
MOV [EDI],DL
INC EDI
LOOP @I2
MOV DL,0
MOV [EDI], DL
INC EDI
MOV EAX, EDI
SUB EAX, Str1
ret
IntToStr endp
;-------------------------------------------------------------------
;Определение длины строки
;Str1 - указатель на строку
; функция возвращает длину строки символов в регистре EAX
LENSTR PROC Str1

CLD
CLD
MOV EDI, Str1
MOV EBX,EDI
MOV ECX,100 ; ограничить длину строки
MOV EAX, 0
REPNE SCASB ; найти символ 0
SUB EDI, EBX ; длина строки, включая 0
MOV EAX,EDI
DEC EAX
RET
LENSTR ENDP
;-------------------------------------------------------------------
; Вывод строки в окно консоли
; StrPtr - указатель на выводимую строку, оканчивающуюся 0
; consoleOutHandle - дескриптор буфера консоли вывода
PrintStr proc StrPtr


INVOKE CharToOem, StrPtr, StrPtr
INVOKE LENSTR, StrPtr ; определение длины строки
INVOKE WriteConsole,
Handle,
StrPtr,
eax,
OFFSET @numBytes, 0
ret
PrintStr endp
FloatToStr proc Num


fstcw cw
or cw, 0C00h
fldcw cw
mov edi, strr
mov ecx, 20
@F0: mov byte ptr [edi],0
inc edi
loop @F0
mov edi, strr
fld Num
fadd corr
fldz
fcomip ST, ST(1)
jb @F1
mov byte ptr [edi],'-'
inc edi
@F1: fsub corr
fabs
fadd corr
fist Numi
INVOKE IntToStr, Numi, edi
dec edi
mov bl,'.'
mov [edi],bl
inc edi
fild Numi
fsubrp
fabs
fimul tol
fistp Numi
push tol
push corr
mov corr, 10
@F2: mov edx,0 ; определение количества нулей после точки
mov eax, tol
idiv corr
mov tol, eax
cmp Numi, eax
jge @F3
mov byte ptr [edi],'0'
inc edi
cmp tol, 1
jg @F2
cmp Numi, 0
je @F4
@F3: INVOKE IntToStr, Numi, edi
@F4: pop corr
pop tol
ret
FloatToStr endp
; Файл win.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\gdi32.inc
include c:\masm32\include\shlwapi.inc
; стандартные дескрипторы окна
IDI_APPLICATION = 32512
IDI_HAND = 32513
IDI_QUESTION = 32514
IDI_EXCLAMATION = 32515
IDI_ASTERISK = 32516
;стандартные дескрипторы курсора
IDC_ARROW = 32512
IDC_IBEAM = 32513
IDC_WAIT = 32514
IDC_CROSS = 32515
IDC_UPARROW = 32516
IDC_SIZE = 32640
IDC_ICON = 32641
IDC_SIZENWSE = 32642
IDC_SIZENESW = 32643
IDC_SIZEWE = 32644
IDC_SIZENS = 32645
; свойства окна
CS_VREDRAW = 0001h
CS_HREDRAW = 0002h
CS_KEYCVTWINDOW = 0004H
CS_DBLCLKS = 0008h
CS_OWNDC = 0020h
CS_CLASSDC = 0040h
CS_PARENTDC = 0080h
CS_NOKEYCVT = 0100h
CS_SAVEBITS = 0800h
CS_NOCLOSE = 0200h
CS_BYTEALIGNCLIENT = 1000h
CS_BYTEALIGNWINDOW = 2000h
CS_GLOBALCLASS = 4000h
; цвет кисти
WHITE_BRUSH =0 ;прозрачное окно
LTGRAY_BRUSH =1
GRAY_BRUSH =2
DKGRAY_BRUSH =3
BLACK_BRUSH =4
NULL_BRUSH =5 ; привычный цвет окна
HOLLOW_BRUSH =5
; структура
WNDCLASS STRUCT
style DD ?
lpfnWndProc DD ?
cbClsExtra DD 0
cbWndExtra DD 0
hInstance DD ?
hIcon DD ?
hCursor DD ?
hbrBackground DD ?
lpszMenuName DD 0
lpszClassName DD ?
WNDCLASS ENDS
; тип окна
WS_OVERLAPPED =000000000h
WS_ICONICPOPUP =0C0000000h
WS_POPUP =080000000h
WS_CHILD =040000000h
WS_MINIMIZE =020000000h
WS_VISIBLE =010000000h
WS_DISABLED =008000000h
WS_CLIPSIBLINGS =004000000h
WS_CLIPCHILDREN =002000000h
WS_MAXIMIZE =001000000h
WS_CAPTION =000C00000h ;WS_BORDER | WS_DLGFRAME
WS_BORDER =000800000h
WS_DLGFRAME =000400000h
WS_VSCROLL =000200000h
WS_HSCROLL =000100000h
WS_SYSMENU =000080000h
WS_THICKFRAME =000040000h
WS_HREDRAW =000020000h
WS_VREDRAW =000010000h
WS_GROUP =000020000h
WS_TABSTOP =000010000h
WS_MINIMIZEBOX =000020000h
WS_MAXIMIZEBOX =000010000h
; отображение окна
SW_HIDE =0
SW_SHOWNORMAL =1
SW_NORMAL =1
SW_SHOWMINIMIZED =2
SW_SHOWMAXIMIZED =3
SW_MAXIMIZE =3
SW_SHOWNOACTIVATE =4
SW_SHOW =5
SW_MINIMIZE =6
SW_SHOWMINNOACTIVE =7
SW_SHOWNA =8
SW_RESTORE =9
; Типы сообщений
WM_NULL equ 0h
WM_CREATE equ 1h
WM_DESTROY equ 2h
WM_MOVE equ 3h
WM_SIZE equ 5h
WM_ACTIVATE equ 6h
WM_SETFOCUS equ 7h
WM_KILLFOCUS equ 08h
WM_ENABLE equ 0Ah
WM_SETREDRAW equ 0Bh
WM_SETTEXT equ 0Ch
WM_GETTEXT equ 0Dh
WM_GETTEXTLENGTH equ 0Eh
WM_PAINT equ 0Fh
WM_CLOSE equ 10h
WM_QUIT equ 12h
WM_KEYFIRST equ 100h
WM_KEYDOWN equ 100h
WM_KEYUP equ 101h
WM_CHAR equ 102h
WM_INITDIALOG equ 110h
WM_COMMAND equ 111h
WM_SYSCOMMAND equ 112h
WM_TIMER equ 113h
WM_HSCROLL equ 114h
WM_VSCROLL equ 115h
WM_MOUSEMOVE equ 200h
WM_LBUTTONDOWN equ 201h
WM_LBUTTONUP equ 202h
WM_LBUTTONDBLCLK equ 203h
WM_RBUTTONDOWN equ 204h
WM_RBUTTONUP equ 205h
WM_RBUTTONDBLCLK equ 206h
WM_MBUTTONDOWN equ 207h
WM_MBUTTONUP equ 208h
WM_MBUTTONDBLCLK equ 209h
WM_WINDOWPOSCHANGING equ 46h
WM_WINDOWPOSCHANGED equ 47h
WM_SIZING equ 214h
; структура сообщения
POINT STRUCT
x DD ?
y DD ?
POINT ENDS
MSG STRUCT
hwnd DD ?
message DD ?
wParam DD ?
lParam DD ?
time DD ?
pt POINT <>
MSG ENDS
PAINTSTRUCT STRUCT
hdc DWORD 0 ; дескриптор контекста окна
fErase DWORD 0 ; 1 – стирать фон, 0 – оставить фон окна
left DWORD 0 ; левый
top DWORD 0 ; верхний
right DWORD 0 ; правый
bottom DWORD 0 ; нижний угол прямоугольника для перерисовки
fRes DWORD 0 ; резервный, используется системой
fIncUp DWORD 0 ; резервный, используется системой
Reserv DB 32 dup(0) ; резервный, используется системой
PAINTSTRUCT ENDS
RECT STRUCT
left dd 0
top dd 0
right dd 0
bottom dd 0
RECT ENDS
SRCCOPY equ 0CC0020h
SRCPAINT equ 0EE0086h
SRCAND equ 8800C6h
SRCINVERT equ 660046h
SRCERASE equ 440328h
PATCOPY equ 0F00021h
PATPAINT equ 0FB0A09h
PATINVERT equ 5A0049h
DSTINVERT equ 550009h
BLACKNESS equ 42h
WHITENESS equ 0FF0062h
PS_SOLID equ 0
PS_DASH equ 1
PS_DOT equ 2
PS_DASHDOT equ 3
PS_DASHDOTDOT equ 4
PS_NULL equ 5
PS_INSIDEFRAME equ 6
PS_USERSTYLE equ 7
PS_ALTERNATE equ 8
PS_STYLE_MASK equ 0Fh
PS_ENDCAP_ROUND equ 0h
PS_ENDCAP_SQUARE equ 100h
PS_ENDCAP_FLAT equ 200h
PS_ENDCAP_MASK equ 0F00h
PS_JOIN_ROUND equ 0h
PS_JOIN_BEVEL equ 1000h
PS_JOIN_MITER equ 2000h
PS_JOIN_MASK equ 0F000h
PS_COSMETIC equ 0h
PS_GEOMETRIC equ 10000h
PS_TYPE_MASK equ 0F0000h
SM_CXSCREEN equ 0
SM_CYSCREEN equ 1
SM_CXVSCROLL equ 2
SM_CYHSCROLL equ 3
SM_CYCAPTION equ 4
SM_CXBORDER equ 5
SM_CYBORDER equ 6
SM_CXDLGFRAME equ 7
SM_CYDLGFRAME equ 8
SM_CYVTHUMB equ 9
SM_CXHTHUMB equ 10
SM_CXICON equ 11
SM_CYICON equ 12
SM_CXCURSOR equ 13
SM_CYCURSOR equ 14
SM_CYMENU equ 15
SM_CXFULLSCREEN equ 16
SM_CYFULLSCREEN equ 17
SM_CYKANJIWINDOW equ 18
SM_MOUSEPRESENT equ 19
SM_CYVSCROLL equ 20
SM_CXHSCROLL equ 21
SM_DEBUG equ 22
SM_SWAPBUTTON equ 23
SM_RESERVED1 equ 24
SM_RESERVED2 equ 25
SM_RESERVED3 equ 26
SM_RESERVED4 equ 27
SM_CXMIN equ 28
SM_CYMIN equ 29
SM_CXSIZE equ 30
SM_CYSIZE equ 31
SM_CXFRAME equ 32
SM_CYFRAME equ 33
SM_CXMINTRACK equ 34
SM_CYMINTRACK equ 35
SM_CXDOUBLECLK equ 36
SM_CYDOUBLECLK equ 37
SM_CXICONSPACING equ 38
SM_CYICONSPACING equ 39
SM_MENUDROPALIGNMENT equ 40
SM_PENWINDOWS equ 41
SM_DBCSENABLED equ 42
SM_CMOUSEBUTTONS equ 43
SM_CXFIXEDFRAME equ SM_CXDLGFRAME
SM_CYFIXEDFRAME equ SM_CYDLGFRAME
SM_CXSIZEFRAME equ SM_CXFRAME
SM_CYSIZEFRAME equ SM_CYFRAME
SM_SECURE equ 44
SM_CXEDGE equ 45
SM_CYEDGE equ 46
SM_CXMINSPACING equ 47
SM_CYMINSPACING equ 48
SM_CXSMICON equ 49
SM_CYSMICON equ 50
SM_CYSMCAPTION equ 51
SM_CXSMSIZE equ 52
SM_CYSMSIZE equ 53
SM_CXMENUSIZE equ 54
SM_CYMENUSIZE equ 55
SM_ARRANGE equ 56
SM_CXMINIMIZED equ 57
SM_CYMINIMIZED equ 58
SM_CXMAXTRACK equ 59
SM_CYMAXTRACK equ 60
SM_CXMAXIMIZED equ 61
SM_CYMAXIMIZED equ 62
SM_NETWORK equ 63
SM_CLEANBOOT equ 67
SM_CXDRAG equ 68
SM_CYDRAG equ 69
SM_SHOWSOUNDS equ 70
SM_CXMENUCHECK equ 71
SM_CYMENUCHECK equ 72
SM_SLOWMACHINE equ 73
SM_MIDEASTENABLED equ 74
SM_MOUSEWHEELPRESENT equ 75
SM_CMETRICS equ 75
SM_XVIRTUALSCREEN equ 76
SM_YVIRTUALSCREEN equ 77
SM_CXVIRTUALSCREEN equ 78
SM_CYVIRTUALSCREEN equ 79
SM_CMONITORS equ 80
; файл с текстом программы
.586
.MODEL FLAT, stdcall
RGBW equ 00CCCCCCh ; цвет фона окна
include win.inc
include console.inc
.data
HWND DD 0 ; дескриптор главного окна
HINST DD 0 ; дескриптор приложения
TITL DB "Программа",0
CLASSNAME DB 'CLASS32',0
Message MSG <?>
WC WNDCLASS <?>
CPBUT db 'Рассчитать',0
CLSBTN db 'BUTTON',0
CLSEDT db 'EDIT',0
CAP db 'Сообщение',0
TEXTA db 20 dup(0) ; текст в полях редактирования
TEXTB db 20 dup(0)
TEXTC db 20 dup(0)
x dd 0
y dd 0
k dd 0
hBut DD ? ; дескриптор кнопки
hedt1 DD ? ; дескриптор поля 1
hedt2 DD ? ; дескриптор поля 2
hedt3 DD ? ;дескриптор поля 3
hdc DD ? ; дескриптор контекста окна
ps PAINTSTRUCT <?>
mess1 db 'Вычислить четверть',0 ; надпись в окне
mess1_len equ $-mess1-1
mess2 db '=',10 dup(' '),0 ; результат суммы строковый
sum_len equ $-mess2-1
.code
START proc
; получить дескриптор приложения
INVOKE GetModuleHandle, 0
MOV HINST, EAX
; заполнить структуру окна стиль
MOV WC.style, CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
; процедура обработки сообщений
MOV WC.lpfnWndProc, OFFSET WNDPROC
MOV EAX, HINST
MOV WC.hInstance, EAX
INVOKE LoadIcon, 0, IDI_APPLICATION
MOV WC.hIcon, EAX
INVOKE LoadCursor, 0, IDC_ARROW
MOV WC.hCursor, EAX
INVOKE CreateSolidBrush, RGBW
MOV WC.hbrBackground, EAX
MOV DWORD PTR WC.lpszMenuName, 0
MOV DWORD PTR WC.lpszClassName, OFFSET CLASSNAME
INVOKE RegisterClass, OFFSET WC
; создать окно зарегистрированного класса
INVOKE CreateWindowEx, 0,
OFFSET CLASSNAME,
OFFSET TITL,
WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_GROUP + WS_TABSTOP,
100, ; X — координата левого верхнего угла
100, ; Y — координата левого верхнего угла
400, ; DX - ширина окна
450, ; DY — высота окна
0, 0, HINST,0
CMP EAX, 0 ; проверка на ошибку
JZ END_LOOP
MOV HWND, EAX ; дескриптор окна
INVOKE ShowWindow, HWND, SW_SHOWNORMAL ; показать созданное окно
INVOKE UpdateWindow, HWND ;перерисовать видимую часть окна
;-------------------------------------------------------------------
; цикл обработки сообщений
MSG_LOOP:
INVOKE GetMessage, OFFSET Message, 0,0,0
CMP EAX, 0
JE END_LOOP
INVOKE TranslateMessage, OFFSET Message
INVOKE DispatchMessageA, OFFSET Message
JMP MSG_LOOP
END_LOOP:
INVOKE ExitProcess, Message.wParam ; выход из программы
START endp
; --------------------------------------------------
; процедура окна
WNDPROC PROC hW




CMP Mes, WM_DESTROY
JE WMDESTROY
CMP Mes, WM_CREATE
JE WMCREATE
CMP Mes, WM_COMMAND
JE WMCOMMAND
CMP Mes, WM_PAINT
JE WMPAINT
JMP DEFWNDPROC
;------------------------------------------------------------------
WMCREATE: ; создание окна
INVOKE CreateWindowExA, 0, ; поле редактирования 1
offset CLSEDT, ;имя класса окна
offset TEXTA, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
10, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt1,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt1, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; поле редактирования 2
offset CLSEDT, ;имя класса окна
offset TEXTB, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
90, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt2,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt2, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; поле редактирования 3
offset CLSEDT, ;имя класса окна
offset TEXTC, ;надпись в поле
WS_CHILD+WS_VISIBLE, ;стиль окна
170, 50, ;x, y
60, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hedt3,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hedt3, SW_SHOWNORMAL
INVOKE CreateWindowExA, 0, ; кнопка
offset CLSBTN, ;имя класса окна
offset CPBUT, ;надпись на кнопке
WS_CHILD+WS_VISIBLE, ;стиль окна кнопки
10, 90, ;x, y
100, 20, ;длина, ширина
hW, ;дескриптор окна
0, ;дескриптор меню
HINST, ;дескриптор приложения
0 ;lpParam
mov hBut,eax ; сохранение дескриптора
mov eax,0
INVOKE ShowWindow, hBut, SW_SHOWNORMAL
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
WMCOMMAND: ; обработка нажатия кнопки
mov eax, hBut
cmp lParam,eax
jne COM_END ; команда не соответствует нажатию кнопки
INVOKE SendMessage, hedt1, WM_GETTEXT, 20, offset TEXTA
INVOKE SendMessage, hedt2, WM_GETTEXT, 20, offset TEXTB
INVOKE SendMessage, hedt3, WM_GETTEXT, 20, offset TEXTC
INVOKE StrToInt, offset TEXTA
mov k, eax
INVOKE StrToInt, offset TEXTB
mov x,eax
INVOKE StrToInt, offset TEXTC
mov y,eax
mov eax,x
mov ebx,y
cmp x,0
JL xl ; // сравниваем х с нулем. Если меньше переходит на метку, если нет пере
cmp y,0
JL y2 ; //сравниваем y с нулем. если меньше уходит на ответ 2
JMP y4 ; // переходит на ответ 1
xl: cmp y,0
JL y1 ; // сравниваем у с нулем, если отрицательное переход на ответ 3
JMP y3 ; // Положительное у, переход на ответ 4
y4: mov eax,1
mov k,eax
JMP end1
y3: mov eax,4
mov k,eax
JMP end1
y2: mov eax,2
mov k,eax
JMP end1
y1: mov eax,3
mov k,eax
end1:
mov eax, sum_len
INVOKE TextOutA, ; стирание строки результата в окне
hdc, 180, 50, offset mess2, eax
INVOKE IntToStr, k, offset mess2+1
INVOKE LENSTR, offset mess2 ; определение длины результата
push eax
INVOKE TextOutA, ; вывод результата
hdc, 300, 50, offset mess2, eax
pop ecx ; очистка строки
inc ecx
mov al,' '
mov edi, offset mess2+1
CLR: mov [edi],al
inc edi
loop CLR
COM_END:
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
WMPAINT: ; перерисовка окна
INVOKE BeginPaint, hW, offset ps
mov hdc,eax
INVOKE SetBkColor, hdc, RGBW
mov eax, mess1_len
INVOKE TextOutA, hdc, 10, 20, offset mess1, eax
INVOKE EndPaint, hdc, offset ps
MOV EAX, 0
JMP FINISH
;------------------------------------------------------------------
DEFWNDPROC: ; обработка сообщения по умолчанию
INVOKE DefWindowProc,
hW, Mes, wParam, lParam
JMP FINISH
;------------------------------------------------------------------
WMDESTROY: ; выход из цикла обработки сообщений
INVOKE PostQuitMessage, 0
MOV EAX, 0
FINISH: ret
WNDPROC ENDP
END START
З.Ы. ЫЫЫЫЫЫЫЫЫыыыыыыыы.... *ушел вешаться на люстре*
@темы: Мир жесток, мир жесток и немилосерден к рыжим (с), Лучше сунуть (нос?) под пресс, чем учиться на ПС! (с)
избави меня Ками от информатики....Лучше избави меня Ками от физикиТочнее мне пока еще предстоит, ибо бог он все-таки студенческий))))
~Justin XDDDD
Вредная привычкак - тыкать на что попало))))