Напишите комментарии к программе - 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, чтобы завершить работу программы.