Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





В этом фрагменте кода мы передаем параметры в процедуры в соответствии с соглашением stdcaii.
Мы можем сделать следующий шаг и применить для вызова наших процедур CalcLeftTop И CalcRightBottom оператор invoke. Для ЭТОГО необходимо внести соответствующие коррективы в текст программы. Исходный текст программы, в которой используется оператор invoke, приведен в листинге 5.16. Все изменения и коррективы выделены жирным шрифтом.
Листинг 5.16. Программа рисования эллипса, в которой используются разработанные процедуры и оператор i n v o k e
. DRAWEL.ASM
.386
.model flat, stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
LOCAL msg :MSG

Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance
mov wc.hbrBackground, C0L0RJBTNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
push IDI_APPLICATION
push NULL
call Loadlcon
mov wc.hlcon, EAX
push IDC_ARROW
push NULL
call LoadCursor
mov wc.hCursor, EAX
mov wc.hlconSm, 0
lea EAX, wc
push EAX
call RegisterClassEx
invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName,\
ADDR szDisplayName, WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT, CWJJSEDEFAULT, CWJJSEDEFAULT,\
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
mov hWnd,EAX
push SW_SHOWNORMAL
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
; WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
CalcLeftTop PROTO :DWORD,:DWORD
CalcRightBottom PROTO :DWORD,:DWORD
.data
szDisplayName DB "РИСОВАНИЕ ЭЛЛИПСА", О
CommandLine DD 0
hWnd DD 0
hlnstance DD 0
szClassName DB "Demo_Class", 0
. code
start:
push NULL
call GetModuleHandle
mov hlnstance, EAX call GetCommandLine
mov CommandLine, EAX
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hlnstance
call WinMain
push EAX
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

Локальные переменные процедуры
LOCAL wc -WNDCLASSEX
push hWnd
call ShowWindow
push hWnd call UpdateWindow

Цикл обработки сообщений
StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam'
ret
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
LOCAL rect :RECT
LOCAL xO, yO, xl, yl :DWORD
cmp uMsg, WMJPAINT
j ne next_l
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
lea ESI, rect
push ESI
push hWin
call GetClientRect
invoke CalcLeftTop, rect.left, rect.right
mov xO, EAX
invoke CalcLeftTop, rect.top, rect.bottom
mov yO, EAX
invoke CalcRightBottom, rect.left, rect.right
mov xl, EAX
invoke CalcRightBottom, rect.top, rect.bottom
mov yl, EAX
push yl
push xl
push yO
push xO
push hdc
call Ellipse
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_l:
cmp uMsg, WM_DESTROY
jne next_2
push NULL
call PostQuitMessage
xor EAX, EAX
ret
next 2:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
CalcLeftTop proc topi: DWORD, top2: DWORD
mov EAX, top2
sub EAX, topi
mov EBX, 3
xor EDX, EDX
div EBX
mov ECX, topi
add ECX, EAX
mov EAX, ECX
ret 8
CalcLeftTop endp
CalcRightBottom proc bottoml:DWORD, bottom2:DWORD
mov EAX, bottom2
sub EAX, bottoml
mov EBX, 3
xor EDX, EDX
div EBX
mov ECX, bottom2
sub ECX, EAX
mov EAX, ECX
ret 8
CalcRightBottom endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru