Напишите комментарии к программе - 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
Объяснение кода листинга программы
- Сначала мы определяем переменные и их значения:
- 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
- Затем мы регистрируем класс окна и создаем окно с помощью функций RegisterClassEx и CreateWindowEx.
- Мы перехватываем сообщения с помощью цикла while и функций GetMessage и TranslateMessage, а затем передаем их в функцию DispatchMessage.
- Функция draw() отвечает за отрисовку окна. Она разбивает экран на линии и рисует каждую линию с помощью функции BitBlt.
- Функция WndProc() обрабатывает сообщения, которые приходят в окно. Она проверяет, какое сообщение пришло, и перенаправляет его в соответствующую функцию (например, @CREATE, @DESTROY, @MOUSEMOVE).
- Мы устанавливаем таймер с помощью функции SetTimer и обрабатываем его в функции draw().
- Если нажата левая кнопка мыши, мы переходим в функцию @nobutton.
- В конце мы вызываем функцию ExitProcess с аргументом 0, чтобы завершить работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д