КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Работа с файлами
Создание приложения для Win32 требует рассмотрения некоторых особенностей системы Win32, которые были введены фирмой Microsoft. 1. Передача параметрам функциям Windows API реализована по прямому алгоритму, т. е. если на C Вы вызывали фнукциию так: FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName), то на ассемблере вызов подобной функции будет выглядеть так:
mov eax, offset lpProcName mov ebx, hModule push eax push ebx call GetProcAddress
В то время как в TASM: model FLAT, STDCALL
call GetProcAddress, [hModule], offset lpProcName
В инструкции компилятору «model» мы передали в параметре, что будем использовать модель памяти FLAT и осуществлять стандартную передачу параметров типа STDCALL. STDCALL использует соглашения языка C для процедур с переменными аргументами и соглашения языка Pascal для процедур с постоянными аргументами. Для всех остальных идентификаторов применяются соглашения языка C. Так, например, некоторые функции Windows API используют способ перевернутой передачи параметров в стек – так называемый метод языка С, или С–метод. К таким функциям относят функции, которые могут получать переменное число параметров. Примером может послужить функция wsprintf (LPTSTR lpOut, LPCTSTR lpFmt). Для вызова таких функций нужно воспользоваться модификатором вызова, что в TASM делается так: call_wsprintfA C, offset lpOut, offset lpFmt, offset lpFirstParameter, offset lpSecondParameter, в то время, как другие функции с постоянным числом параметров можно вызывать без всяких модификаторов (если вы конечно воспользовались директивой model FLAT, STDCALL). call GetProcAddressA, [hModule], offset lpProcName 2. Все функции API подразделены на две группы: функции, которые поддерживают UNICODE, и функции, которые поддерживают ANSI. Функции, поддерживающие UNICODE, имеют в конце названия букву «W», а функции, поддерживающие ANSI, имеют в конце названия букву «A». Таким образом: GetProcAddressA – прототип функции GetProcAddress для ANSI. GetProcAddressW – прототип функции GetProcAddress для UNICODE. Различие UNICODE от ANSI заключается в том, что в ANSI для передачи одной буквы используется один байт, в зависимости от текущей кодовой страницы в различных кодировках, а в UNICODE использьзуется два байта (так называемый WIDE символ). Поэтому при использовании UNICODE все ссылки на строки включают в себя букву W. Так например: LPCTSTR (ANSI) = LPCWSTR (UNICODE). LPTSTR (ANSI) = LPWSTR (UNICODE). 3. Все функции Windows API теперь зависят от регистра букв, т. е. если если функция API называется GetProcAddressA, то и объявление то же должно быть GetProcAddressA. Например:
EXTRN GetProcAddressA: PROC
call GetProcAddressA, [hModule], offset lpProcName
4. Рассмотрим теперь оссобенности компиляции и компоновки программ. Для компиляции под Win32, Вам понадобяться следующие программы: tasm32.exe – Borland Turbo Assembler tlink32.exe – Borland Turbo Link brcc32.exe – Borland Resource Compiler Для запуска этих программ понадобяться еще несколько библиотек. Итак, для того, чтобы откомпилировать нашу программу, используя TASM, надо передать компилятору такие параметры: tasm32.exe /ml <имя файла> Опция /ml в данном случае говорит о том, что в тексте программы во всех именах следует различать регистр букв, т. е. CreateWindow будет отличаться от CREATEWINDOW. Теперь скомпонуем нашу программу tlink32.exe – c – aa – Tpe <имя файла> Опция – с аналогична опции /ml, она говорит компоновщику о том, что в файле должны различаться регистры букв у имен переменных и функций. Опция – aa указывает компилятору, что нужно создать обычное приложение Windows, использующее GDI. Если вы укажите опцию – ap, то компоновщик сгенерирует консольное приложение Windows (примером консольного приложения может послужить FAR). Написание консольных приложений я рассмотрю в одной из своих следующих статей. Последней опцией – Tpe мы сообщаем компоновщику, что нужно сгенерировать EXE файл. Если мы укажем опцию – Tpd, то на выходе компоновщика получим DLL файл. Компиляция ресурсов в Win32 происходит по тому же алгоритму, что и в Win16. Например, для компиляции ресурсов, находящихся в файле myres.rc, нужно запустить brcc32.exe с следующимим параметрами. brcc32.exe myres.rc
Текст исходной программы Файл Print: .386 locals __ model flat, stdcall
include wtypes.inc include wingdi.inc include winuser.inc include commdlg.inc include resource.ash
L equ <LARGE>
dataseg szDocName db "Printing in Assembler", 0
codeseg PrintDlg equ PrintDlgA StartDoc equ StartDocA DrawText equ DrawTextA extrn PrintDlgA:PROC extrn StartDocA:PROC extrn StartPage:PROC extrn GetDeviceCaps:PROC extrn SetRect:PROC extrn DrawText:PROC extrn EndPage:PROC extrn EndDoc:PROC extrn DeleteDC:PROC extrn CommDlgExtendedError:PROC
public Print Print proc arg hwnd:dword, pszText:dword uses ebx, edi, esi local __pd:PRINTDLG, __di:DOCINFO, __rc:RECT
mov [__pd.pdStructSize], size PRINTDLG mov eax, [hwnd] mov [__pd.pdHwndOwner], eax mov [__pd.pdHDevMode], 0 mov [__pd.pdHDevNames], 0 mov [__pd.pdFlags], (PD_RETURNDC or PD_RETURNDEFAULT) lea eax, __pd push eax call PrintDlg test eax, eax jz __error_ret
mov [__di.diCbSize], size DOCINFO mov [__di.diLpszDocName], offset szDocName mov [__di.diLpszOutput], 0 mov [__di.diLpszDatatype], 0 mov [__di.diFwType], 0 lea eax, __di push eax mov ebx, [__pd.pdHDC] push ebx call StartDoc test eax, eax jle __error_ret
push ebx call StartPage test eax, eax jle __error_ret
push L LOGPIXELSX push ebx call GetDeviceCaps mov esi, eax push L LOGPIXELSY push ebx call GetDeviceCaps mov edi, eax push PHYSICALHEIGHT push ebx call GetDeviceCaps sub eax, edi sub eax, edi push eax push PHYSICALWIDTH push ebx call GetDeviceCaps sub eax, esi sub eax, esi push eax push edi push esi lea edi, __rc push edi call SetRect
push L (DT_LEFT or DT_TOP or DT_WORDBREAK) push edi push L -1 push pszText push ebx call DrawText
push ebx call EndPage
push ebx call EndDoc
push ebx call DeleteDC
mov eax, 1 ret
__error_ret: xor eax, eax ret
Print endp
end
Файл Wap32: .386 locals jumps .model flat, STDCALL include win32.inc; some 32-bit constants and structures include win_my.inc; my constants and structures include wtypes.inc include wingdi.inc include resource.ash L equ <LARGE> ; ; Define the external functions we will be linking to ; SendDlgItemMessage equ SendDlgItemMessageA extrn SendDlgItemMessageA:PROC extrn CreateFileA:PROC extrn CloseHandle:PROC extrn WriteFile:PROC extrn SetFilePointer:PROC
extrn CreateDCA:PROC extrn Escape:PROC extrn DeleteDC:PROC
extrn SendMessageA:PROC extrn GetWindowTextA:PROC extrn SetWindowTextA:PROC
extrn MoveToEx:PROC extrn LineTo:PROC extrn CreatePen:PROC extrn SelectObject:PROC extrn DeleteObject:PROC extrn Rectangle:PROC extrn Ellipse:PROC extrn GetTickCount:PROC
extrn BeginPaint:PROC extrn CreateWindowExA:PROC extrn DefWindowProcA:PROC extrn DispatchMessageA:PROC extrn EndPaint:PROC extrn ExitProcess:PROC extrn FindWindowA:PROC extrn GetMessageA:PROC extrn GetModuleHandleA:PROC extrn GetStockObject:PROC extrn InvalidateRect:PROC extrn LoadCursorA:PROC extrn LoadIconA:PROC extrn PostQuitMessage:PROC extrn RegisterClassA:PROC extrn ShowWindow:PROC extrn SetWindowPos:PROC extrn TextOutA:PROC extrn TranslateMessage:PROC extrn UpdateWindow:PROC extrn MessageBoxA:PROC extrn Print:PROC ; ; for Unicode support, Win32 remaps some functions to either the Ansi or ; Wide char versions. We will assume Ansi for this example. ; CreateWindowEx equ <CreateWindowExA> DefWindowProc equ <DefWindowProcA> DispatchMessage equ <DispatchMessageA> FindWindow equ <FindWindowA> GetMessage equ <GetMessageA> GetModuleHandle equ <GetModuleHandleA> LoadCursor equ <LoadCursorA> LoadIcon equ <LoadIconA> MessageBox equ <MessageBoxA> RegisterClass equ <RegisterClassA> TextOut equ <TextOutA>
.data hFile dd 0 dwNotUsed dw?
newhwnd dd 0 lppaint PAINTSTRUCT <?> msg MSGSTRUCT <?> wc WNDCLASS <?> pnt1 POINT <?> pnt2 POINT <?>
penColor dd 00FF0000h hPen dd?
szMesBox1 db 'Warning!', 0 szMesBox2 db 'Printer Error', 0
flag1 dd 1 flag2 dd 0 shape dd 0
szLine db 'Line', 0 szRect db 'Rectangle', 0 szEllipse db 'Ellipse', 0
hInst dd 0
szTitleName db 'Win32 Assembly Program' zero db 0 enter db 13, 10 szClassName db 'ASMCLASS32', 0
FileName db 'info.txt', 0 ;---------- Printer ---------- prnDriver db 'WWLXRU.DRV', 0 prnName db 'Lexmark 1020 ColorFine 2', 0 prnPort db 'LPT1', 0 hPrinterDC dd 0 ;----------- Edit ------------ EClassName db 'EDIT', 0 hEdit1 dd? hInstEdit1 dd? idEdit1 dw 200h hEdit2 dd? hInstEdit2 dd? idEdit2 dw 202h
;---------------------------- szMsg1 db 60 Dup(?) msgLength dd? ;--------- Button ----------- BClassName db 'BUTTON', 0 BCaption db 'Press here...', 0 hButton dd? hInstButton dd? idButton dw 201h
BCaption1 db 'Not press here...', 0 hButton1 dd? hInstButton1 dd? idButton1 dw 203h
.code ;--------------------------- ; This is where control is received from the loader. ; start: push L 0 call GetModuleHandle; get hmod (in eax) mov [hInst], eax; hInstance is same as HMODULE ; in the Win32 world push L 0 push offset szClassName call FindWindow or eax, eax jz reg_class
mov [zero], ' '; space to modify title string
reg_class: ; initialize the WndClass structure mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS mov [wc.clsLpfnWndProc], offset WndProc mov [wc.clsCbClsExtra], 0 mov [wc.clsCbWndExtra], 0 mov eax, [hInst] mov [wc.clsHInstance], eax
push L IDI_ASTERISK push L 0 call LoadIcon mov [wc.clsHIcon], eax
push L IDC_CROSS push L 0 call LoadCursor mov [wc.clsHCursor], eax
mov [wc.clsHbrBackground], COLOR_WINDOW + 1 mov dword ptr [wc.clsLpszMenuName], 0 mov dword ptr [wc.clsLpszClassName], offset szClassName
push offset wc call RegisterClass
push L 0; lpParam push [hInst]; hInstance push L 0; menu push L 0; parent hwnd push L CW_USEDEFAULT; height push L CW_USEDEFAULT; width push L CW_USEDEFAULT; y push L CW_USEDEFAULT; x push L WS_OVERLAPPEDWINDOW; Style push offset szTitleName; Title string push offset szClassName; Class name push L 0; extra style call CreateWindowEx mov [newhwnd], eax
push L SW_SHOWNORMAL push [newhwnd] call ShowWindow push [newhwnd] call UpdateWindow
;------ Edit1 Create -------- push L 0 push [hInstEdit1] push idEdit1 push [newhwnd] push L 20 push L 200 push L 100 push L 100 push L WS_CHILD+WS_VISIBLE+WS_BORDER+ES_LEFT+ES_NOHIDESEL+ES_AUTOHSCROLL push L 0 push offset EClassName push L 0 call CreateWindowEx mov [hEdit1], EAX cmp EAX, 0 jne asdfg push L 0 push offset szMesBox1 push offset szMesBox2 push L 0 call MessageBox
asdfg: push L SW_SHOW push [hEdit1] call ShowWindow push [hEdit1] call UpdateWindow
;------ Button Create ------- push L 0 push [hInstButton] push idButton push [newhwnd] push L 30 push L 160 push L 130 push L 120 push L WS_CHILD+WS_VISIBLE+BS_PUSHBUTTON push offset BCaption push offset BClassName push L 0 call CreateWindowEx mov [hButton], EAX
push L SW_SHOWNORMAL push [hButton] call ShowWindow push [hButton] call UpdateWindow
push offset szLine push [hEdit1] call SetWindowTextA
msg_loop: push L 0 push L 0 push L 0 push offset msg call GetMessage
cmp ax, 0 je end_loop
push offset msg call TranslateMessage
push offset msg
call DispatchMessage
jmp msg_loop
end_loop: push [msg.msWPARAM] call ExitProcess
; we never get to here ;---------------------------- WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
LOCAL theDC:DWORD, _sz:BYTE:1024
cmp [wmsg], WM_COMMAND je command cmp [wmsg], WM_DESTROY je wmdestroy cmp [wmsg], WM_RBUTTONDOWN je wmrbuttondown cmp [wmsg], WM_SIZE je wmsize cmp [wmsg], WM_CREATE je wmcreate cmp [wmsg], WM_LBUTTONDOWN je wmlbuttondown cmp [wmsg], WM_PAINT je wmpaint cmp [wmsg], WM_GETMINMAXINFO je wmgetminmaxinfo jmp defwndproc
command: cmp wparam, 201h jne ex run: push L 0 push L 0 push L WM_GETTEXTLENGTH push [hEdit1] call SendMessageA inc EAX mov msgLength, EAX
push msgLength push offset szMsg1 push [hEdit1] call GetWindowTextA
push offset szMsg1 push [hButton] call SetWindowTextA
mov EAX, msgLength dec EAX mov msgLength, EAX ;-------------------------- ; Open File push L 0 push L FILE_ATTRIBUTE_NORMAL push L OPEN_ALWAYS push L 0 push L 0 push GENERIC_WRITE push offset FileName call CreateFileA mov [hFile], eax ; SetFilePointer push L FILE_END push L 0 push L 0 push [hFile] call SetFilePointer ; Write File push L 0 push offset dwNotUsed push msgLength push offset szMsg1 push [hFile] call WriteFile push L 0 push offset dwNotUsed push 2 push offset enter push [hFile] call WriteFile ; Close File push [hFile] call CloseHandle jmp print
wmpaint: push offset lppaint push [hwnd] call BeginPaint mov [theDC], eax
push penColor push L 20 push L 0 call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
push 30 push 30 push 10 push 10 push [theDC] call Rectangle
push [hPen] call DeleteObject
push penColor push L 0 push L 0 call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
cmp flag2, 1 jne next
cmp shape, 0 jne re push pnt1.ptY push pnt1.ptX push [theDC] call MoveToEx push pnt2.ptY push pnt2.ptX push [theDC] call LineTo jmp next re: cmp shape, 1 jne el push pnt2.ptY push pnt2.ptX push pnt1.ptY push pnt1.ptX push [theDC] call Rectangle jmp next el: push pnt2.ptY push pnt2.ptX push pnt1.ptY push pnt1.ptX push [theDC] call Ellipse next: push [hPen] call DeleteObject
push offset lppaint push [hwnd] call EndPaint
mov eax, 0 jmp finish wmcreate: mov eax, 0 jmp finish
defwndproc: push [lparam] push [wparam] push [wmsg] push [hwnd] call DefWindowProc jmp finish
wmdestroy: push L 0 call PostQuitMessage mov eax, 0 jmp finish
wmlbuttondown:
push lparam mov EAX, 0 mov ECX, 0 pop AX pop CX
cmp flag1, 1 jne l1
mov pnt1.ptX, EAX mov pnt1.ptY, ECX
inc flag1 jmp finish l1: mov pnt2.ptX, EAX mov pnt2.ptY, ECX dec flag1
push L 0 push L 0 push [hwnd] call InvalidateRect; repaint window
mov eax, 0 mov flag2, 1 jmp finish
print: ;---- Print ------------
lea ebx, szMsg1 push ebx push [hwnd] call Print jmp finish message: push L 0 push offset szMesBox1 push offset szMesBox2 push L 0 call MessageBox jmp finish ;--------------------------- wmrbuttondown: push wparam pop EAX cmp AX, MK_CONTROL+MK_RBUTTON je changeColor
cmp shape, 2 jne incr mov shape, 0 jmp next0 incr: inc shape next0: cmp shape, 0 jne next1 push offset szLine jmp next3 next1: cmp shape, 1 jne next2 push offset szRect jmp next3 next2: cmp shape, 2 push offset szEllipse next3: push [hEdit1] call SetWindowTextA jmp finish
changeColor: call GetTickCount;случайное?зменен?е цвета mov CX, AX mov EAX, 0 mov AX, CX mov CX, 21 mul CX cmp EAX, 00ffffffh jge changeColor
mov penColor, EAX push L 0 push L 0 push [hwnd] call InvalidateRect; repaint window
jmp finish
wmsize: mov eax, 0 jmp finish
wmgetminmaxinfo: mov ebx, [lparam]; ptr to minmaxinfo struct mov [(MINMAXINFO ptr ebx).mintrackposition_x], 350 mov [(MINMAXINFO ptr ebx).mintrackposition_y], 60 mov eax, 0 jmp finish ex: finish: ret WndProc endp
public WndProc ends end start
Результат работы исходной программы
Текст модифицированной программы
.386 locals jumps .model flat, STDCALL include win32.inc; some 32-bit constants and structures include win_my.inc; my constants and structures include wtypes.inc include wingdi.inc include resource.ash L equ <LARGE> ; ; Define the external functions we will be linking to
SendDlgItemMessage equ SendDlgItemMessageA extrn SendDlgItemMessageA:PROC extrn CreateFileA:PROC extrn CloseHandle:PROC extrn WriteFile:PROC extrn SetFilePointer:PROC extrn CreateDCA:PROC extrn Escape:PROC extrn DeleteDC:PROC extrn SendMessageA:PROC extrn GetWindowTextA:PROC extrn SetWindowTextA:PROC extrn MoveToEx:PROC extrn LineTo:PROC extrn CreatePen:PROC extrn SelectObject:PROC extrn DeleteObject:PROC extrn Rectangle:PROC extrn Ellipse:PROC extrn GetTickCount:PROC extrn BeginPaint:PROC extrn CreateWindowExA:PROC extrn DefWindowProcA:PROC extrn DispatchMessageA:PROC extrn EndPaint:PROC extrn ExitProcess:PROC extrn FindWindowA:PROC extrn GetMessageA:PROC extrn GetModuleHandleA:PROC extrn GetStockObject:PROC extrn InvalidateRect:PROC extrn LoadCursorA:PROC extrn LoadIconA:PROC extrn PostQuitMessage:PROC extrn RegisterClassA:PROC extrn ShowWindow:PROC extrn SetWindowPos:PROC extrn TextOutA:PROC extrn TranslateMessage:PROC extrn UpdateWindow:PROC extrn MessageBoxA:PROC extrn Print:PROC ; ; for Unicode support, Win32 remaps some functions to either the Ansi or ; Wide char versions. We will assume Ansi for this example. ; CreateWindowEx equ <CreateWindowExA> DefWindowProc equ <DefWindowProcA> DispatchMessage equ <DispatchMessageA> FindWindow equ <FindWindowA> GetMessage equ <GetMessageA> GetModuleHandle equ <GetModuleHandleA> LoadCursor equ <LoadCursorA> LoadIcon equ <LoadIconA> MessageBox equ <MessageBoxA> RegisterClass equ <RegisterClassA> TextOut equ <TextOutA>
.data hFile dd 0 dwNotUsed dw?
newhwnd dd 0 lppaint PAINTSTRUCT <?> msg MSGSTRUCT <?> wc WNDCLASS <?> pnt1 POINT <?> pnt2 POINT <?> hPen dd? szMesBox1 db 'Warning!', 0 szMesBox2 db 'Printer Error', 0 flag1 dd 1 flag2 dd 0 flag3 dd 0 shape dd 0 shape2 dd 0 szLine db 'Line', 0 szRect db 'Rectangle', 0 szEllipse db 'Ellipse', 0 szDraw db 'Draw', 0 hInst dd 0 szTitleName db ' Гусев А. В. Русецкий С. С. гр.107229', 0 zero db 0 enter db 13, 10 szClassName db 'ASMCLASS32', 0 FileName db 'info.txt', 0 ;--------- Printer ---------- prnDriver db 'WWLXRU.DRV', 0 prnName db 'Lexmark 1020 ColorFine 2', 0 prnPort db 'LPT1', 0 hPrinterDC dd 0 ;--------- Edit ------------ EClassName db 'EDIT', 0 hEdit1 dd? hInstEdit1 dd? idEdit1 dw 200h hEdit2 dd? hInstEdit2 dd? idEdit2 dw 202h
;--------------------------- szMsg1 db 60 Dup(?) msgLength dd? ;------- Button ----------- BClassName db 'BUTTON', 0 BCaption db ' Print ', 0 hButton dd? hInstButton dd? idButton dw 201h
BCaption1 db 'Not press here...', 0 hButton1 dd? hInstButton1 dd? idButton1 dw 203h
.code ;-------------------------- ; This is where control is received from the loader. ; start: push L 0 call GetModuleHandle; get hmod (in eax) mov [hInst], eax; hInstance is same as HMODULE ; in the Win32 world push L 0 push offset szClassName call FindWindow or eax, eax jz reg_class
mov [zero], ' '; space to modify title string
reg_class: ; initialize the WndClass structure mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS mov [wc.clsLpfnWndProc], offset WndProc mov [wc.clsCbClsExtra], 0 mov [wc.clsCbWndExtra], 0 mov eax, [hInst] mov [wc.clsHInstance], eax
push L IDI_ASTERISK push L 0 call LoadIcon mov [wc.clsHIcon], eax
push L IDC_CROSS push L 0 call LoadCursor mov [wc.clsHCursor], eax
mov [wc.clsHbrBackground], COLOR_WINDOW + 1 mov dword ptr [wc.clsLpszMenuName], 0 mov dword ptr [wc.clsLpszClassName], offset szClassName
push offset wc call RegisterClass
push L 0; lpParam push [hInst]; hInstance push L 0; menu push L 0; parent hwnd push L 475; высота окна push L 560; ширина окна push L 30; y окна push L 100; x окна push L WS_OVERLAPPEDWINDOW; Style
push offset szTitleName; Title string push offset szClassName; Class name push L 0; extra style call CreateWindowEx mov [newhwnd], eax
push L SW_SHOWNORMAL push [newhwnd] call ShowWindow push [newhwnd] call UpdateWindow
;----- Edit1 Create --------- push L 0 push [hInstEdit1] push idEdit1 push [newhwnd] push L 20 push L 200 push L 10 push L 150 push L WS_CHILD+WS_VISIBLE+WS_BORDER+ES_LEFT+ES_NOHIDESEL+ES_AUTOHSCROLL push L 0 push offset EClassName push L 0 call CreateWindowEx mov [hEdit1], EAX cmp EAX, 0 jne asdfg push L 0 push offset szMesBox1 push offset szMesBox2 push L 0 call MessageBox
asdfg: push L SW_SHOW push [hEdit1] call ShowWindow push [hEdit1] call UpdateWindow
;----- Button Create -------- push L 0 push [hInstButton] push idButton push [newhwnd] push L 30 push L 160 push L 40 push L 170 push L WS_CHILD+WS_VISIBLE+BS_PUSHBUTTON push offset BCaption push offset BClassName push L 0 call CreateWindowEx mov [hButton], EAX push L SW_SHOWNORMAL push [hButton] call ShowWindow push [hButton] call UpdateWindow push offset szLine push [hEdit1] call SetWindowTextA
msg_loop: push L 0 push L 0 push L 0 push offset msg call GetMessage
cmp ax, 0 je end_loop
push offset msg call TranslateMessage
push offset msg call DispatchMessage
jmp msg_loop
end_loop: push [msg.msWPARAM] call ExitProcess
; we never get to here ;--------------------------- WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
LOCAL theDC:DWORD, _sz:BYTE:1024
cmp [wmsg], WM_COMMAND je command cmp [wmsg], WM_DESTROY je wmdestroy cmp [wmsg], WM_RBUTTONDOWN je wmrbuttondown cmp [wmsg], WM_SIZE je wmsize cmp [wmsg], WM_CREATE je wmcreate cmp [wmsg], WM_LBUTTONDOWN je wmlbuttondown cmp [wmsg], WM_LBUTTONUP je wmlbuttonup cmp [wmsg], WM_MOUSEMOVE je wmmousemove cmp [wmsg], WM_PAINT je wmpaint cmp [wmsg], WM_GETMINMAXINFO je wmgetminmaxinfo jmp defwndproc
command: cmp wparam, 201h jne ex
run: push L 0 push L 0 push L WM_GETTEXTLENGTH push [hEdit1] call SendMessageA inc EAX mov msgLength, EAX push msgLength push offset szMsg1 push [hEdit1] call GetWindowTextA push offset szMsg1 push [hButton] call SetWindowTextA
mov EAX, msgLength dec EAX mov msgLength, EAX ;-------------------------- ; Open File push L 0 push L FILE_ATTRIBUTE_NORMAL push L OPEN_ALWAYS push L 0 push L 0 push GENERIC_WRITE push offset FileName call CreateFileA mov [hFile], eax ; SetFilePointer push L FILE_END push L 0 push L 0 push [hFile] call SetFilePointer ; Write File push L 0 push offset dwNotUsed push msgLength push offset szMsg1 push [hFile] call WriteFile push L 0 push offset dwNotUsed push 2 push offset enter push [hFile]
call WriteFile ; Close File push [hFile] call CloseHandle jmp print
wmpaint: push offset lppaint push [hwnd] call BeginPaint mov [theDC], eax
push L 0ff0000h;цвет установка цвета для 1 прямоугольника push L 50;ширина push L 0;стиль call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
push 50;рисование 1 прямоугольника push 50 push 0 push 0 push [theDC] call Rectangle
push 000ff00h;цвет для 2 прямоугольника push L 50 push L 0 call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
push 50;рисование 2 прямоугольника push 550 push 0 push 500 push [theDC] call Rectangle
push 00000ffh;цвет для 3 прямоугольника push L 50 push L 0 call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
push 450;рисование 3 прямоугольника push 50 push 400 push 0 push [theDC] call Rectangle
push 0f32fffh;цвет для 4 прямоугольника push L 50 push L 0 call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject
push 450;рисование 4 прямоугольника push 550 push 400 push 500 push [theDC] call Rectangle
push [hPen] call DeleteObject push L 0ff0000h;цвет установка цвета для 1 прямоугольника push L 2;ширина push L 0;стиль call CreatePen mov [hPen], EAX push [hPen] push [theDC] call SelectObject cmp flag2, 1 jne next cmp shape, 0 jne re push pnt1.ptY;Рисование прямой линии push pnt1.ptX push [theDC] call MoveToEx push pnt2.ptY push pnt2.ptX push [theDC] call LineTo jmp next re:;Рисование прямоугольника cmp shape, 1 jne el push pnt2.ptY push pnt2.ptX push pnt1.ptY push pnt1.ptX push [theDC] call Rectangle jmp next el:;Рисование эллипса cmp shape, 2 jne draw push pnt2.ptY push pnt2.ptX push pnt1.ptY push pnt1.ptX push [theDC] call Ellipse jmp next draw:;Рисование мышью push pnt1.ptY push pnt1.ptX push [theDC] call MoveToEx push pnt2.ptY push pnt2.ptX push [theDC] call LineTo jmp next next: push [hPen] call DeleteObject
push offset lppaint
push [hwnd] call EndPaint
mov eax, 0 jmp finish wmcreate: mov eax, 0 jmp finish
defwndproc: push [lparam] push [wparam] push [wmsg] push [hwnd] call DefWindowProc jmp finish
wmdestroy: push L 0 call PostQuitMessage mov eax, 0 jmp finish
wmlbuttondown: mov flag3, 1 push lparam mov EAX, 0 mov ECX, 0 pop AX pop CX cmp flag1, 1 jne l1 mov pnt1.ptX, EAX mov pnt1.ptY, ECX inc flag1 jmp finish l1: mov pnt2.ptX, EAX mov pnt2.ptY, ECX dec flag1 push L 0 push L 0 push [hwnd] call InvalidateRect; repaint window mov eax, 0 mov flag2, 1 jmp finish
print: ; Print ------------------- lea ebx, szMsg1 push ebx push [hwnd] call Print jmp finish message: push L 0 push offset szMesBox1 push offset szMesBox2 push L 0 call MessageBox jmp finish ;-------------------------- wmrbuttondown: push wparam pop EAX cmp shape, 3 jne incr mov shape, 0 jmp next0 incr: inc shape next0: cmp shape, 0 jne next1 push offset szLine jmp next4 next1: cmp shape, 1 jne next2 push offset szRect jmp next4 next2: cmp shape, 2 jne next3 push offset szEllipse jmp next4 next3: cmp shape, 3 jne next4 push offset szDraw mov shape2, 0 next4: push [hEdit1] call SetWindowTextA jmp finish
push L 0 push L 0 push [hwnd] call InvalidateRect; repaint window
jmp finish
;------------------------- wmmousemove: cmp shape, 3 jne finish cmp flag3, 1 jne finish push lparam mov EAX, 0 mov ECX, 0 pop AX pop CX cmp shape2, 1 jne l11 mov pnt1.ptX, EAX mov pnt1.ptY, ECX mov pnt2.ptX, EAX mov pnt2.ptY, ECX inc shape2 jmp finish l11: mov ebx, pnt2.ptX mov pnt1.ptX, ebx mov ebx, pnt2.ptY mov pnt1.ptY, ebx mov pnt2.ptX, EAX mov pnt2.ptY, ECX push L 0 push L 0 push [hwnd] call InvalidateRect; repaint window jmp finish ;----------------------- wmlbuttonup: mov flag3, 0 jmp finish wmsize: mov eax, 0 jmp finish
wmgetminmaxinfo: mov ebx, [lparam]; ptr to minmaxinfo struct mov [(MINMAXINFO ptr ebx).mintrackposition_x], 350 mov [(MINMAXINFO ptr ebx).mintrackposition_y], 60 mov eax, 0 jmp finish ex: finish: ret WndProc endp
public WndProc ends end start
Результат работы программы
Дата добавления: 2014-01-06; Просмотров: 358; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |