Как молоды мы были Студентам с вопросами о лабораторных работах сюда страница 42 Код (ASM): .686P .model flat includelib user32.lib includelib gdi32.lib includelib comctl32.lib include windows.inc extern _imp__CreateWindowExA@48:dword extern _imp__DefWindowProcA@16:dword extern _imp__DispatchMessageA@4:dword extern _imp__GetMessageA@16:dword extern _imp__ExitProcess@4:dword extern _imp__RegisterClassA@4:dword extern _imp__ImageList_Create@20:dword extern _imp__LoadImageA@24:dword extern _imp__ImageList_Add@12:dword extern _imp__DeleteObject@4:dword extern _imp__GetDC@4:dword extern _imp__SetTimer@16:dword extern _imp__ImageList_Draw@24:dword extern _imp__GetStockObject@4:dword .code start: xor ebx,ebx mov edi,offset style assume edi:ptr WNDCLASSA push BLACK_BRUSH call _imp__GetStockObject@4 mov [edi].hbrBackground,eax push edi call _imp__RegisterClassA@4 push ebx push [edi].hInstance push ebx push ebx push 94 push 226 push CW_USEDEFAULT push CW_USEDEFAULT push WS_OVERLAPPEDWINDOW + WS_VISIBLE push [edi].lpszClassName push [edi].lpszClassName push ebx call _imp__CreateWindowExA@48 ;создать окно mov [edi].hIcon,eax push ebx push 1 push ILC_COLOR8 push 61 ;высота кадра 640/10=64 push 64 ;ширина кадра 386/6=64 call _imp__ImageList_Create@20 mov hList, eax mov edi, eax push LR_LOADFROMFILE push ebx ;0 push ebx ;0 push ebx ;IMAGE_BITMAP=0 push offset picture push hInst ;hInstance call _imp__LoadImageA@24 push eax push ebx push eax push edi call _imp__ImageList_Add@12 call _imp__DeleteObject@4 mov esi, offset msg assume esi:ptr MSG push [esi].hwnd call _imp__GetDC@4 mov hDC, eax push offset Draw push 100 push 1 push [esi].hwnd call _imp__SetTimer@16 message_loop: push ebx ;цикл обработки сообщений push ebx push ebx push esi call _imp__GetMessageA@16 push esi call _imp__DispatchMessageA@4 ;вернуть управление Windows jmp message_loop WndProc proc ;hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD cmp dword ptr [esp+8],WM_DESTROY;Msg,WM_DESTROY je short @@WM_DESTROY jmp _imp__DefWindowProcA@16 ;все сообщения, не обрабатываемые в функции WndProc, направляются на обработку по умолчанию @@WM_DESTROY: push msg.wParam call _imp__DeleteObject@4 push 0 ;завершение программы call _imp__ExitProcess@4 WndProc endp Draw proc push ILD_NORMAL ; drawing style push 0 ; y-coordinate to draw at push 80 ; x-coordinate to draw at push hDC ; handle to the destination device context push style ; index of the image to draw push hList ; handle to the image list call _imp__ImageList_Draw@24 inc style cmp style,60 jb a1 mov style,0 a1:ret Draw endp ;WNDCLASSEX ----------------------------------------------- style dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна hDC dd WndProc;Адрес процедуры обработки событий hList dd 0 cbWndExtra dd 0 hInst dd 400000h ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу) msg MSG<10003h,10011h,0,0,szWinTitle,<0,0>>; Указатель на имя нашего класса ;---------------------------------------------------------- szWinTitle db "Вращающийся тор",0 picture db 'tor1.bmp',0 end start В аттаче bmp-файл с раскадровкой вращающегося тора (ширина 3832 пиксела, высота 65 пикелов) , по-кадрово через определенные промежутки времени выводим все это на экран, выбирается картинка 64Х61 и показывается на 0,1 секунды - затем сдвигаемся на 64 пиксела и выводим следующий кадр, когда доходим до 60 кадра счетчик кадров обнуляется и все начинается с начала.