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

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

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

Помогите пожалуйста прокомментировать код к программе:
include     kernel32.inc
include     user32.inc
include     gdi32.inc
includelib  IMPORT32.LIB
 
.const
NULL                                 equ 0
TRUE                                 equ 1
FALSE                                equ NULL
 
CS_HREDRAW                           equ 2h
CS_VREDRAW                           equ 1h
CW_USEDEFAULT                        equ 80000000h
 
COLOR_BTNFACE                        equ 15 
 
IDI_APPLICATION                      equ 32512
IDC_ARROW                            equ 32512
 
;windows style
WS_VISIBLE                           equ 10000000h
WS_CAPTION                           equ 0C00000h
WS_CHILD                             equ 40000000h
WS_SYSMENU                           equ 80000h
WS_THICKFRAME                        equ 40000h
WS_MINIMIZEBOX                       equ 20000h
WS_MAXIMIZEBOX                       equ 10000h
WS_OVERLAPPEDWINDOW       equ  WS_VISIBLE or WS_CAPTION\
                          OR WS_SYSMENU OR WS_THICKFRAME\ 
                          OR WS_MINIMIZEBOX OR WS_MAXIMIZEBOX
;Windows Messages
WM_DESTROY              equ 2h
WM_CREATE               equ 1h
WM_COMMAND              equ 111h
IMAGE_BITMAP                equ 0
LR_LOADFROMFILE             equ 10h
TRANSPARENT                          equ 1

SRCCOPY                              equ 0CC0020h
 
;Structures
.data
    ClassName db "MainWinClass",0
    Class_button db 'BUTTON',0
    title_button db 'click me',0
    
    AppName  db "PROG 1",0
    path    db 'dr_eggs7.BMP',0
    
    hdc1        dd 0
    hdc_bit     dd 0
    hbit        dd 0
    
    hbit_oj dd 0
    hdc1_oj dd 0
    
    hbit_text   dd 0
    hdc_text        dd 0

    hbit_tmp    dd 0
    hdc_tmp     dd 0
    
    dx_ dd -0.03490658503989 ; 2*pi/180
    A   dd 5.0 ; Амплітуда
    x dd 0.0

    buff db 260 dup(0)
.data?
    hwnd DWORD ?
 
    WNDCLASSEX:
      cbSize            DWORD      ?
      style             DWORD      ?
      lpfnWndProc       DWORD      ?
      cbClsExtra        DWORD      ?
      cbWndExtra        DWORD      ?
      hInstance         DWORD      ?
      hIcon             DWORD      ?
      hCursor           DWORD      ?
      hbrBackground     DWORD      ?
      lpszMenuName      DWORD      ?
      lpszClassName     DWORD      ?
      hIconSm           DWORD      ?
    
    MSG:
      ms_hwnd      DWORD      ?
      ms_message   DWORD      ?
      ms_wParam    DWORD      ?
      ms_lParam    DWORD      ?
      ms_time      DWORD      ?
      ms_x         DWORD      ?
      ms_y         DWORD      ?

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

textual
Листинг программы
.586
.model flat,STDCALL
option casemap:none
 
include l5.inc
.code
begin:
    ; визначаємо хендл модуля
    call GetModuleHandle, NULL
    mov   hInstance,eax
    ; заповнюємо структуру WNDCLASSEX
    mov   cbSize,12*4       
    mov   style,CS_HREDRAW or CS_VREDRAW
    mov   lpfnWndProc, OFFSET WndProc
    mov   cbClsExtra,NULL
    mov   cbWndExtra,NULL
    ; колір фону сірий
    call  GetSysColorBrush,COLOR_BTNFACE
    mov   hbrBackground,eax
    mov   lpszMenuName,NULL
    mov   lpszClassName,OFFSET ClassName
    ; іконка програми IDI_APPLICATION
    call LoadIcon,NULL,IDI_APPLICATION
    mov   hIcon,eax
    mov   hIconSm,eax
    ;курсор стандартний
    call LoadCursor,NULL,IDC_ARROW
    mov   hCursor,eax
    ;реєструемо новий клас
    call RegisterClassEx,offset WNDCLASSEX
    ;ств. батьківське вікно 
    call CreateWindowEx,NULL,offset ClassName,offset AppName,\
                        WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
                        CW_USEDEFAULT,800,\
                        600,NULL,NULL,\
                        hInstance,NULL
    mov  hwnd,eax
    ;ств. кнопку, на батьківському вікні (стиль WS_CHILD)
 
    ; цикл прослуховування повідомлень
    loop:
        ;відловити тільки ті що відносятся до нашого вікна
        call GetMessage, OFFSET MSG,NULL,0,0
        ;якщо 0 або -1, вікна не має
        test eax,eax
        jz @exit
        ; перетворюємо з віртуальних ключів у систему повідомлень
        call TranslateMessage, offset MSG
        ; відпра. на обробку у функ. WndProc
        call DispatchMessage, offset MSG
    jmp loop
@exit:
    call ExitProcess,0
 
draw proc ; проц. руху
    LOCAL py,px:DWORD
    ; розбиває на лінії і кажну малює по сін. 
    ; нажна наступна лінія має зміщення по фазі на 2 гадуси (dx_)
    mov px,1 ; н-р лінні 
a:      
    fld x ; завант. х у спів процесор
    fsin ; знах сін
    fmul A ; множ на ампліт
    
    fistp py ; витягуємо результат 
    
    fld x ; до х додоаємо зміщення dx_ 
    fadd dx_
    fstp x  
    ; у тимчасовий бітмап (малюнок) копіюємо полоску в 1 пх., але координата у по сін 
    call BitBlt,hdc_tmp,px,py,1,250,hdc_bit,px,1,SRCCOPY
    inc px ; збільшуємо х
    cmp px,700 ;поки до 700 не дійшли
    jl a; шуруємо на мітку а     
    ; коли все намалювали результат на екран коп. 
    call BitBlt,hdc1,20,40,700,250,hdc_tmp,2,0,SRCCOPY
    
    ret
 
draw endp
; функ. обробки повыдомлень вікна 
WndProc proc hWnd1:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL tmp,X1,Y1:DWORD
    ; якщо прийшло повідомлення про знищення вікна, перейти на мітку @DESTROY
    cmp uMsg,WM_DESTROY
    jz @DESTROY
    ; якщо прийшло повідомлення про створення вікна, перейти на мітку @CREATE 
    cmp uMsg,WM_CREATE
    jz @CREATE
    ;якщо прийшло повідомлення про здійснення дії (наприклад натиснута кнопка), перейти на мітку @COMMAND
    ; виклік фун. дія по замовчуванню
    call DefWindowProc,hWnd1,uMsg,wParam,lParam     
    ret
    
@DESTROY:
        ; відправ. повід про закриття вікна
        call PostQuitMessage,NULL
        ret 
@CREATE:
        call GetDC,hWnd1 ; береб граф контекс вікна
        mov hdc1,eax
        ; завант мал
        call LoadImage,hInstance,offset path,IMAGE_BITMAP,0,0,LR_LOADFROMFILE
        mov hbit,eax
         ; ств. сумісний граф контекст 
        call CreateCompatibleDC,hdc1
        mov hdc_bit,eax
        call SelectObject,hdc_bit,hbit ; приєднюємо граф контекст до малюнка, щоб ми могли з ним прац.
    
 
        call CreateCompatibleDC,hdc1 ; ств. тимчас. малюнок, куда будемо малювати сін. малюнок
        mov hdc_tmp,eax
        call CreateCompatibleBitmap,hdc1,700,250
        mov hbit_tmp,eax        
        call SelectObject,hdc_tmp,hbit_tmp
        call Rectangle,hdc_tmp,0,0,700,250
 
        call SetTimer,0,0,100,offset draw    ; задаємо таймер руху (100 мілі с), обробник draw
 
        ret
@MOUSEMOVE:
         
@nobutton:      
        ret     
WndProc endp
 
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