Текст программы:
.386 .model flat, stdcall include win32.inc extrn BeginPaint:PROC extrn BitBlt:PROC extrn CreateCompatibleBitmap:PROC extrn CreateCompatibleDC:PROC extrn CreateHatchBrush:PROC extrn CreatePen:PROC extrn CreateWindowExA:PROC extrn DefWindowProcA:PROC extrn DeleteDC:PROC extrn DeleteObject:PROC extrn DispatchMessageA:PROC extrn Ellipse:PROC extrn EndPaint:PROC extrn ExitProcess:PROC extrn GetClientRect:PROC extrn GetMessageA:PROC extrn GetModuleHandleA:PROC extrn GetStockObject:PROC extrn LineTo:PROC extrn LoadCursorA:PROC extrn LoadIconA:PROC extrn MoveToEx:PROC extrn PatBlt:PROC extrn PostQuitMessage:PROC extrn Rectangle:PROC extrn RegisterClassA:PROC extrn SelectObject:PROC extrn SetPixel:PROC extrn ShowWindow:PROC extrn TranslateMessage:PROC extrn UpdateWindow:PROC BITMAP struct bmType dd ? bmWidth dd ? bmHeight dd ? bmWidthBytes dd ? bmPlanes dw ? bmBitsPixel dw ? bmBits dd ? BITMAP ends SRCCOPY = 00CC0020h PATCOPY = 00F00021h TRUE = 1 FALSE = 0 .data newhwnd dd 0 msg MSGSTRUCT > wc WNDCLASS > Rect RECT > hDC dd ? hCompatibleDC dd ? PaintStruct PAINTSTRUCT > hCompatibleBitmap dd ? hBitmap dd ? hOldBitmap dd ? hOldPen dd ? hOldBrush dd ? Pens dd 2 dup(?) Brushes dd 2 dup(?) hInstance dd 0 szTitleName db 'GraphDemo', 0 szClassName db 'ASMCLASS32',0 x dd ? y dd ? p dd ? .code ;----------------------------------------------------------------------------- start: call GetModuleHandleA, 0 mov [hInstance], eax ; initialize the WndClass structure mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW mov [wc.clsLpfnWndProc], offset GraphDemoWndProc mov [wc.clsCbClsExtra], 0 mov [wc.clsCbWndExtra], 0 mov eax, [hInstance] mov [wc.clsHInstance], eax call LoadIconA, 0, IDI_APPLICATION mov [wc.clsHIcon], eax call LoadCursorA, 0 ,IDC_ARROW mov [wc.clsHCursor], eax call GetStockObject, WHITE_BRUSH mov [wc.clsHbrBackground], eax mov [wc.clsLpszMenuName], 0 mov [wc.clsLpszClassName], offset szClassName call RegisterClassA, offset wc call CreateWindowExA, 0,offset szClassName,offset szTitleName, \ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, \ CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0, \ [hInstance], 0 mov [newhwnd], eax call ShowWindow, [newhwnd], SW_SHOWNORMAL call UpdateWindow, [newhwnd] msg_loop: call GetMessageA, offset msg, 0, 0, 0 .if eax != 0 call TranslateMessage, offset msg call DispatchMessageA, offset msg jmp msg_loop .endif call ExitProcess, [msg.msWPARAM] ;----------------------------------------------------------------------------- GraphDemoWndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\ wparam:DWORD, lparam:DWORD cmp [wmsg], WM_PAINT je wmpaint cmp [wmsg], WM_DESTROY je wmdestroy call DefWindowProcA, [hwnd],[wmsg],[wparam],[lparam] jmp finish wmpaint: ;--------------------------------------- call CreatePen, 1,0,0FF0000h mov [dword ptr Pens], eax call CreatePen, 3,0,000000h mov [dword ptr Pens+4], eax call CreateHatchBrush, 1,00000FFh mov [dword ptr Brushes], eax call CreateHatchBrush, 2,0FF0080h mov [dword ptr Brushes+4], eax ;--------------------------------------- call GetClientRect, [hwnd], offset Rect call BeginPaint, [hwnd], offset PaintStruct mov [hDC], eax call CreateCompatibleDC, [hDC] mov [hCompatibleDC], eax call GetClientRect, [hwnd], offset Rect call CreateCompatibleBitmap, [hDC],[Rect.rcRight],[Rect.rcBottom] mov [hCompatibleBitmap], eax call SelectObject, [hCompatibleDC],[hCompatibleBitmap] mov [hOldBitmap], eax call PatBlt, [hCompatibleDC],0,0,[Rect.rcRight], \ [Rect.rcBottom], PATCOPY ;--------------------------------------- mov [x], 0 mov [y], 0 mov [p], 0 @@lp2: call SetPixel, [hCompatibleDC],[x],[y],00FF0000h .if eax == -1 mov [x], 0 add [y], 10h .endif add [x], 10h .if eax == -1 cmp [p], -1 jz @@lp3 .endif mov [p], eax jmp @@lp2 @@lp3: ;--------------------------------------- call SelectObject, [hCompatibleDC],[dword ptr Pens] mov [hOldPen], eax call MoveToEx, [hCompatibleDC],[Rect.rcLeft],[Rect.rcTop],0 call LineTo, [hCompatibleDC],[Rect.rcRight],[Rect.rcBottom] call SelectObject, [hCompatibleDC],[dword ptr Pens+4] call MoveToEx, [hCompatibleDC],[Rect.rcRight],[Rect.rcTop],0 call LineTo, [hCompatibleDC],[Rect.rcLeft],[Rect.rcBottom] call SelectObject, [hCompatibleDC],[hOldPen] ;======================================= call SelectObject, [hCompatibleDC],[dword ptr Brushes] mov [hOldBrush], eax call Rectangle, [hCompatibleDC],100,75,450,200 call SelectObject, [hCompatibleDC],[dword ptr Brushes+4] call Ellipse, [hCompatibleDC],50,50,200,100 call SelectObject, [hCompatibleDC],[hOldBrush] ;======================================= call BitBlt, [hDC],[PaintStruct.PSrcPaint.rcLeft], \ [PaintStruct.PSrcPaint.rcTop], \ [PaintStruct.PSrcPaint.rcRight], \ [PaintStruct.PSrcPaint.rcBottom], \ [hCompatibleDC], \ [PaintStruct.PSrcPaint.rcLeft], \ [PaintStruct.PSrcPaint.rcTop], \ SRCCOPY call DeleteObject, [dword ptr Pens] call DeleteObject, [dword ptr Pens+4] call DeleteObject, [dword ptr Brushes] call DeleteObject, [dword ptr Brushes+4] call SelectObject, [hCompatibleDC], [hOldBitmap] call DeleteObject, [hCompatibleBitmap] call DeleteDC, [hCompatibleDC] call EndPaint, [hwnd],offset PaintStruct mov eax, 0 jmp finish wmdestroy: call DeleteObject, [hBitmap] call PostQuitMessage, 0 mov eax, 0 finish: ret GraphDemoWndProc endp ends end start