Студопедия

КАТЕГОРИИ:


Архитектура-(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

 


 

Результат работы программы

<== предыдущая лекция | следующая лекция ==>
Программирование таймера и динамика | Будем рассматривать расширенный графический адаптер EGА
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 331; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 1.025 сек.