Напишите комментарии к программе - 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, чтобы завершить работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д