Напишите комментарии к программе - Assembler (223417)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста прокомментировать код к программе:
Листинг программы
  1. include kernel32.inc
  2. include user32.inc
  3. include gdi32.inc
  4. includelib IMPORT32.LIB
  5. .const
  6. NULL equ 0
  7. TRUE equ 1
  8. FALSE equ NULL
  9. CS_HREDRAW equ 2h
  10. CS_VREDRAW equ 1h
  11. CW_USEDEFAULT equ 80000000h
  12. COLOR_BTNFACE equ 15
  13. IDI_APPLICATION equ 32512
  14. IDC_ARROW equ 32512
  15. ;windows style
  16. WS_VISIBLE equ 10000000h
  17. WS_CAPTION equ 0C00000h
  18. WS_CHILD equ 40000000h
  19. WS_SYSMENU equ 80000h
  20. WS_THICKFRAME equ 40000h
  21. WS_MINIMIZEBOX equ 20000h
  22. WS_MAXIMIZEBOX equ 10000h
  23. WS_OVERLAPPEDWINDOW equ WS_VISIBLE or WS_CAPTION\
  24. OR WS_SYSMENU OR WS_THICKFRAME\
  25. OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
  26. ;Windows Messages
  27. WM_DESTROY equ 2h
  28. WM_CREATE equ 1h
  29. WM_COMMAND equ 111h
  30. IMAGE_BITMAP equ 0
  31. LR_LOADFROMFILE equ 10h
  32. TRANSPARENT equ 1
  33.  
  34. SRCCOPY equ 0CC0020h
  35. ;Structures
  36. .data
  37. ClassName db "MainWinClass",0
  38. Class_button db 'BUTTON',0
  39. title_button db 'click me',0
  40. AppName db "PROG 1",0
  41. path db 'dr_eggs7.BMP',0
  42. hdc1 dd 0
  43. hdc_bit dd 0
  44. hbit dd 0
  45. hbit_oj dd 0
  46. hdc1_oj dd 0
  47. hbit_text dd 0
  48. hdc_text dd 0
  49.  
  50. hbit_tmp dd 0
  51. hdc_tmp dd 0
  52. dx_ dd -0.03490658503989 ; 2*pi/180
  53. A dd 5.0 ; Амплітуда
  54. x dd 0.0
  55.  
  56. buff db 260 dup(0)
  57. .data?
  58. hwnd DWORD ?
  59. WNDCLASSEX:
  60. cbSize DWORD ?
  61. style DWORD ?
  62. lpfnWndProc DWORD ?
  63. cbClsExtra DWORD ?
  64. cbWndExtra DWORD ?
  65. hInstance DWORD ?
  66. hIcon DWORD ?
  67. hCursor DWORD ?
  68. hbrBackground DWORD ?
  69. lpszMenuName DWORD ?
  70. lpszClassName DWORD ?
  71. hIconSm DWORD ?
  72. MSG:
  73. ms_hwnd DWORD ?
  74. ms_message DWORD ?
  75. ms_wParam DWORD ?
  76. ms_lParam DWORD ?
  77. ms_time DWORD ?
  78. ms_x DWORD ?
  79. ms_y DWORD ?

Решение задачи: «Напишите комментарии к программе»

textual
Листинг программы
  1. .586
  2. .model flat,STDCALL
  3. option casemap:none
  4.  
  5. include l5.inc
  6. .code
  7. begin:
  8.     ; визначаємо хендл модуля
  9.     call GetModuleHandle, NULL
  10.     mov   hInstance,eax
  11.     ; заповнюємо структуру WNDCLASSEX
  12.     mov   cbSize,12*4      
  13.     mov   style,CS_HREDRAW or CS_VREDRAW
  14.     mov   lpfnWndProc, OFFSET WndProc
  15.     mov   cbClsExtra,NULL
  16.     mov   cbWndExtra,NULL
  17.     ; колір фону сірий
  18.     call  GetSysColorBrush,COLOR_BTNFACE
  19.     mov   hbrBackground,eax
  20.     mov   lpszMenuName,NULL
  21.     mov   lpszClassName,OFFSET ClassName
  22.     ; іконка програми IDI_APPLICATION
  23.     call LoadIcon,NULL,IDI_APPLICATION
  24.     mov   hIcon,eax
  25.     mov   hIconSm,eax
  26.     ;курсор стандартний
  27.     call LoadCursor,NULL,IDC_ARROW
  28.     mov   hCursor,eax
  29.     ;реєструемо новий клас
  30.     call RegisterClassEx,offset WNDCLASSEX
  31.     ;ств. батьківське вікно
  32.     call CreateWindowEx,NULL,offset ClassName,offset AppName,\
  33.                         WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
  34.                         CW_USEDEFAULT,800,\
  35.                         600,NULL,NULL,\
  36.                         hInstance,NULL
  37.     mov  hwnd,eax
  38.     ;ств. кнопку, на батьківському вікні (стиль WS_CHILD)
  39.  
  40.     ; цикл прослуховування повідомлень
  41.     loop:
  42.         ;відловити тільки ті що відносятся до нашого вікна
  43.         call GetMessage, OFFSET MSG,NULL,0,0
  44.         ;якщо 0 або -1, вікна не має
  45.         test eax,eax
  46.         jz @exit
  47.         ; перетворюємо з віртуальних ключів у систему повідомлень
  48.         call TranslateMessage, offset MSG
  49.         ; відпра. на обробку у функ. WndProc
  50.         call DispatchMessage, offset MSG
  51.     jmp loop
  52. @exit:
  53.     call ExitProcess,0
  54.  
  55. draw proc ; проц. руху
  56.     LOCAL py,px:DWORD
  57.     ; розбиває на лінії і кажну малює по сін.
  58.     ; нажна наступна лінія має зміщення по фазі на 2 гадуси (dx_)
  59.     mov px,1 ; н-р лінні
  60. a:     
  61.     fld x ; завант. х у спів процесор
  62.     fsin ; знах сін
  63.     fmul A ; множ на ампліт
  64.    
  65.     fistp py ; витягуємо результат
  66.    
  67.     fld x ; до х додоаємо зміщення dx_
  68.     fadd dx_
  69.     fstp x 
  70.     ; у тимчасовий бітмап (малюнок) копіюємо полоску в 1 пх., але координата у по сін
  71.     call BitBlt,hdc_tmp,px,py,1,250,hdc_bit,px,1,SRCCOPY
  72.     inc px ; збільшуємо х
  73.     cmp px,700 ;поки до 700 не дійшли
  74.     jl a; шуруємо на мітку а     
  75.     ; коли все намалювали результат на екран коп.
  76.     call BitBlt,hdc1,20,40,700,250,hdc_tmp,2,0,SRCCOPY
  77.    
  78.     ret
  79.  
  80. draw endp
  81. ; функ. обробки повыдомлень вікна
  82. WndProc proc hWnd1:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
  83. LOCAL tmp,X1,Y1:DWORD
  84.     ; якщо прийшло повідомлення про знищення вікна, перейти на мітку @DESTROY
  85.     cmp uMsg,WM_DESTROY
  86.     jz @DESTROY
  87.     ; якщо прийшло повідомлення про створення вікна, перейти на мітку @CREATE
  88.     cmp uMsg,WM_CREATE
  89.     jz @CREATE
  90.     ;якщо прийшло повідомлення про здійснення дії (наприклад натиснута кнопка), перейти на мітку @COMMAND
  91.     ; виклік фун. дія по замовчуванню
  92.     call DefWindowProc,hWnd1,uMsg,wParam,lParam    
  93.     ret
  94.    
  95. @DESTROY:
  96.         ; відправ. повід про закриття вікна
  97.         call PostQuitMessage,NULL
  98.         ret
  99. @CREATE:
  100.         call GetDC,hWnd1 ; береб граф контекс вікна
  101.         mov hdc1,eax
  102.         ; завант мал
  103.         call LoadImage,hInstance,offset path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
  104.         mov hbit,eax
  105.          ; ств. сумісний граф контекст
  106.         call CreateCompatibleDC,hdc1
  107.         mov hdc_bit,eax
  108.         call SelectObject,hdc_bit,hbit ; приєднюємо граф контекст до малюнка, щоб ми могли з ним прац.
  109.    
  110.  
  111.         call CreateCompatibleDC,hdc1 ; ств. тимчас. малюнок, куда будемо малювати сін. малюнок
  112.         mov hdc_tmp,eax
  113.         call CreateCompatibleBitmap,hdc1,700,250
  114.         mov hbit_tmp,eax       
  115.         call SelectObject,hdc_tmp,hbit_tmp
  116.         call Rectangle,hdc_tmp,0,0,700,250
  117.  
  118.         call SetTimer,0,0,100,offset draw    ; задаємо таймер руху (100 мілі с), обробник draw
  119.  
  120.         ret
  121. @MOUSEMOVE:
  122.          
  123. @nobutton:     
  124.         ret    
  125. WndProc endp
  126.  
  127. end begin

Объяснение кода листинга программы

  1. Сначала мы определяем переменные и их значения:
    • hInstance (дескриптор модуля) = NULL
    • hbrBackground (дескриптор кисти фона) = NULL
    • lpszMenuName (строка меню) = NULL
    • lpszClassName (строка класса окна) = OFFSET ClassName
    • hIcon (дескриптор иконки) = NULL
    • hCursor (дескриптор курсора) = NULL
    • hwnd (дескриптор окна) = NULL
    • hdc1 (дескриптор графического контекста окна) = NULL
    • hbit (дескриптор битмапа) = NULL
    • hdc_bit (дескриптор графического контекста битмапа) = NULL
    • hbit_tmp (дескриптор временного битмапа) = NULL
    • hdc_tmp (дескриптор графического контекста временного битмапа) = NULL
  2. Затем мы регистрируем класс окна и создаем окно с помощью функций RegisterClassEx и CreateWindowEx.
  3. Мы перехватываем сообщения с помощью цикла while и функций GetMessage и TranslateMessage, а затем передаем их в функцию DispatchMessage.
  4. Функция draw() отвечает за отрисовку окна. Она разбивает экран на линии и рисует каждую линию с помощью функции BitBlt.
  5. Функция WndProc() обрабатывает сообщения, которые приходят в окно. Она проверяет, какое сообщение пришло, и перенаправляет его в соответствующую функцию (например, @CREATE, @DESTROY, @MOUSEMOVE).
  6. Мы устанавливаем таймер с помощью функции SetTimer и обрабатываем его в функции draw().
  7. Если нажата левая кнопка мыши, мы переходим в функцию @nobutton.
  8. В конце мы вызываем функцию ExitProcess с аргументом 0, чтобы завершить работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут