1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Вращающийся тор

Тема в разделе "WASM.GUI", создана пользователем Mikl___, 10 мар 2017.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.179
    Как молоды мы были :)
    Студентам с вопросами о лабораторных работах сюда страница 42
    Код (ASM):
    1. .686P
    2. .model flat
    3. includelib user32.lib
    4. includelib gdi32.lib
    5. includelib comctl32.lib
    6. include windows.inc
    7. extern _imp__CreateWindowExA@48:dword
    8. extern _imp__DefWindowProcA@16:dword
    9. extern _imp__DispatchMessageA@4:dword
    10. extern _imp__GetMessageA@16:dword
    11. extern _imp__ExitProcess@4:dword
    12. extern _imp__RegisterClassA@4:dword
    13. extern _imp__ImageList_Create@20:dword
    14. extern _imp__LoadImageA@24:dword    
    15. extern _imp__ImageList_Add@12:dword
    16. extern _imp__DeleteObject@4:dword    
    17. extern _imp__GetDC@4:dword
    18. extern _imp__SetTimer@16:dword
    19. extern _imp__ImageList_Draw@24:dword    
    20. extern _imp__GetStockObject@4:dword
    21. .code
    22. start:    xor ebx,ebx
    23.     mov edi,offset style
    24.     assume edi:ptr WNDCLASSA
    25.     push BLACK_BRUSH
    26.     call _imp__GetStockObject@4
    27.     mov [edi].hbrBackground,eax
    28.     push edi
    29.     call _imp__RegisterClassA@4
    30.     push ebx  
    31.     push [edi].hInstance
    32.     push ebx
    33.     push ebx
    34.     push 94
    35.     push 226
    36.     push CW_USEDEFAULT
    37.     push CW_USEDEFAULT
    38.     push WS_OVERLAPPEDWINDOW + WS_VISIBLE
    39.     push [edi].lpszClassName
    40.     push [edi].lpszClassName
    41.     push ebx
    42.     call _imp__CreateWindowExA@48    ;создать окно
    43.     mov [edi].hIcon,eax
    44.     push ebx
    45.     push 1
    46.     push ILC_COLOR8
    47.     push 61 ;высота кадра  640/10=64
    48.     push 64 ;ширина кадра  386/6=64
    49.     call _imp__ImageList_Create@20
    50.     mov hList, eax
    51.     mov edi, eax
    52.  
    53.     push LR_LOADFROMFILE
    54.     push ebx    ;0
    55.     push ebx    ;0
    56.     push ebx    ;IMAGE_BITMAP=0
    57.     push offset picture
    58.     push hInst    ;hInstance
    59.     call _imp__LoadImageA@24
    60.     push eax
    61.  
    62.     push ebx
    63.     push eax
    64.     push edi
    65.     call _imp__ImageList_Add@12
    66.     call _imp__DeleteObject@4
    67.     mov esi, offset msg
    68.     assume esi:ptr MSG
    69.     push [esi].hwnd
    70.     call _imp__GetDC@4
    71.     mov hDC, eax
    72.     push offset Draw
    73.     push 100
    74.     push 1
    75.     push [esi].hwnd
    76.     call _imp__SetTimer@16
    77.  
    78. message_loop: push ebx  ;цикл обработки сообщений
    79.     push ebx
    80.     push ebx
    81.     push esi
    82.     call _imp__GetMessageA@16
    83.     push esi
    84.     call _imp__DispatchMessageA@4     ;вернуть управление Windows  
    85.     jmp message_loop
    86. WndProc proc ;hwnd:DWORD, Msg:DWORD, wParam:DWORD, lParam:DWORD
    87.     cmp dword ptr [esp+8],WM_DESTROY;Msg,WM_DESTROY
    88.     je short @@WM_DESTROY
    89.     jmp _imp__DefWindowProcA@16   ;все сообщения, не обрабатываемые в функции WndProc, направляются на обработку по умолчанию
    90. @@WM_DESTROY: push msg.wParam
    91.     call _imp__DeleteObject@4
    92.     push 0    ;завершение программы
    93.     call _imp__ExitProcess@4
    94. WndProc endp
    95. Draw proc
    96.     push ILD_NORMAL        ; drawing style
    97.     push 0            ; y-coordinate to draw at
    98.     push 80        ; x-coordinate to draw at
    99.     push hDC        ; handle to the destination device context
    100.     push style        ; index of the image to draw
    101.     push hList        ; handle to the image list
    102.     call _imp__ImageList_Draw@24
    103.     inc style
    104.     cmp style,60
    105.     jb a1
    106.     mov style,0
    107. a1:ret
    108. Draw endp
    109. ;WNDCLASSEX -----------------------------------------------
    110.     style           dd CS_HREDRAW or CS_VREDRAW; Стиль нашего окна
    111.     hDC           dd WndProc;Адрес процедуры обработки событий
    112.     hList          dd 0  
    113.     cbWndExtra dd 0  
    114.     hInst          dd 400000h     ;Адрес нашей проги в памяти (Windows всегда её грузит по этому адресу)
    115.     msg           MSG<10003h,10011h,0,0,szWinTitle,<0,0>>; Указатель на имя нашего класса
    116. ;----------------------------------------------------------
    117.     szWinTitle db "Вращающийся тор",0
    118.     picture       db 'tor1.bmp',0
    119. end start
    В аттаче bmp-файл с раскадровкой вращающегося тора (ширина 3832 пиксела, высота 65 пикелов) , по-кадрово через определенные промежутки времени выводим все это на экран, выбирается картинка 64Х61 и показывается на 0,1 секунды - затем сдвигаемся на 64 пиксела и выводим следующий кадр, когда доходим до 60 кадра счетчик кадров обнуляется и все начинается с начала.
     

    Вложения:

    • tor1.zip
      Размер файла:
      14,6 КБ
      Просмотров:
      310
    Коцит нравится это.