Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_PP_02_KS41.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
129.58 Кб
Скачать
  1. Анализ программы управления аппаратной частьюПк.

Видыработ:

  • изучить программу наАссемблере;

  • провести анализ структурыпрограммы;

  • провести анализ операторовпрограммы;

  • ознакомиться с возможным использованием операторовпрограммногокода.

Задание1.Проанализировать программу,написанную на ассемблереидобавить комментарии к каждойстрочке.

format PEGUI4.0include'win32a.inc'

;nosection defined - fasm will automatically create .flat sectionforboth

; code and data,andset entry pointatthe beginning of thissection

invokeMessageBoxA,0,_message,_caption,MB_ICONQUESTION+MB_YESNOcmp eax,IDYES

jneexit

invokemciSendString,_cmd_open,0,0,0invokemciSendString,_cmd_eject,0,0,0invokemciSendString,_cmd_close,0,0,0

exit:

invokeExitProcess,0

_message db 'Do you need additional place for thebeer?',0

_caption db 'Desktopconfiguration',0

_cmd_open db 'opencdaudio',0

_cmd_eject db 'set cdaudio dooropen',0

_cmd_close db 'closecdaudio',0

; import datainthe samesectiondataimport

librarykernel32,'KERNEL32.DLL',\user32,'USER32.DLL',\

winmm,'WINMM.DLL'

import kernel32,\ExitProcess,'ExitProcess'

import user32,\MessageBoxA,'MessageBoxA'

importwinmm,\mciSendString,'mciSendStringA'

enddata

Задание2.Оформитьотчет.

  1. Анализ программы моделированияграфики.

Видыработ:

  • изучить программу наАссемблере;

  • провести анализ структурыпрограммы;

  • провести анализ операторовпрограммы;

  • ознакомиться с возможным использованием операторовпрограммногокода.

Задание1.Проанализировать программу,написанную на ассемблереидобавить комментарии к каждойстрочке.

format PEGUI4.0entrystart

include'win32a.inc'include'ddraw.inc'

section '.text' code readableexecutablestart:

invokeGetModuleHandleA,NULLmov [hinstance],eax

invokeLoadIconA,NULL,IDI_APPLICATIONmov [wc.hIcon],eax

invokeLoadCursorA,NULL,IDC_ARROWmov [wc.hCursor],eax

mov [wc.style],0

mov [wc.lpfnWndProc],WindowProcmov [wc.cbClsExtra],0

mov [wc.cbWndExtra],0mov eax,[hinstance]

mov [wc.hInstance],eaxmov [wc.hbrBackground],0

mov dword[wc.lpszMenuName],NULLmov dword[wc.lpszClassName],_classinvokeRegisterClassA,wc

test eax,eax

jz startup_error

invokeCreateWindowExA,\0,_class,_title,WS_POPUP+WS_VISIBLE,0,0,0,0,NULL,NULL,[hinstance],NULL

test eax,eax

jz startup_errormov [hwnd],eax

invokeDirectDrawCreate,NULL,DDraw,NULLor eax,eax

jnz ddraw_error

cominvkDDraw,SetCooperativeLevel,\[hwnd],DDSCL_EXCLUSIVE+DDSCL_FULLSCREEN

or eax,eax

jnz ddraw_error

cominvkDDraw,SetDisplayMode,\640,480,8

or eax,eax

jnz ddraw_error

mov [ddsd.dwSize],sizeof.DDSURFACEDESC

mov [ddsd.dwFlags],DDSD_CAPS+DDSD_BACKBUFFERCOUNTmov

[ddsd.ddsCaps.dwCaps],DDSCAPS_PRIMARYSURFACE+DDSCAPS_FLIP+DDSCAPS_COMPLEX

mov [ddsd.dwBackBufferCount],1cominvkDDraw,CreateSurface,\

ddsd,DDSPrimary,NULLor eax,eax

jnzddraw_error

mov [ddscaps.dwCaps],DDSCAPS_BACKBUFFERcominvkDDSPrimary,GetAttachedSurface,\

ddscaps,DDSBackor eax,eax

jnzddraw_error

movesi,picturecallload_picturejcopen_error

mov esi,picturecall load_palette

jc open_error

invokeGetTickCountmov [last_tick],eax

jmp paintmain_loop:

invokePeekMessageA,msg,NULL,0,0,PM_NOREMOVEor eax,eax

jz no_message

invokeGetMessageA,msg,NULL,0,0or eax,eax

jz end_loop

invokeTranslateMessage,msginvokeDispatchMessageA,msg

jmp main_loopno_message:

cmp [active],0

je sleep

cominvkDDSPrimary,IsLostor eax,eax

jz paint

cmp eax,DDERR_SURFACELOST

jne end_loop

cominvkDDSPrimary,Restorepaint:

mov [rect.top],0

mov [rect.bottom],480mov [rect.left],0

mov [rect.right],640

cominvkDDSBack,BltFast,\0,0,[DDSPicture],rect,DDBLTFAST_SRCCOLORKEY

or eax,eax

jnz paint_done

movzxeax,[frame]xor edx,edx

mov ebx,10

div ebx

sal eax,6

add eax,480

mov [rect.top],eax

add eax,64

mov [rect.bottom],eaxsal edx,6

mov [rect.left],edxadd edx,64

mov [rect.right],edx

cominvkDDSBack,BltFast,\[x],[y],[DDSPicture],rect,DDBLTFAST_SRCCOLORKEY

cominvkDDSPrimary,SetPalette,[DDPalette]cominvkDDSPrimary,Flip,0,0

paint_done:

invokeGetTickCountmov ebx,eax

sub ebx,[last_tick]cmp ebx,20

jb main_loopadd [last_tick],20

inc [frame]cmp [frame],60jb main_loopmov [frame],0jmp main_loop

sleep:

invokeWaitMessagejmp main_loop

ddraw_error:

mov eax,_ddraw_errorjmp error

open_error:

mov eax,_open_errorerror:

invokeMessageBoxA,[hwnd],eax,_error,MB_OK+MB_ICONERRORinvokeDestroyWindow,[hwnd]

invokePostQuitMessage,1jmp main_loop

startup_error:

invokeMessageBoxA,[hwnd],_startup_error,_error,MB_OK+MB_ICONERRORend_loop:

invokeExitProcess,[msg.wParam]include'gif87a.inc'

proc WindowProchwnd,wmsg,wparam,lparampush ebxesiedi

mov eax,[wmsg]

cmp eax,WM_CREATEje .wmcreate

cmp eax,WM_DESTROYje .wmdestroy

cmp eax,WM_ACTIVATEje .wmactivate

cmp eax,WM_SETCURSORje .wmsetcursor

cmp eax,WM_MOUSEMOVEje .wmmousemove

cmp eax,WM_KEYDOWNje .wmkeydown

.defwindowproc:

invokeDefWindowProcA,[hwnd],[wmsg],[wparam],[lparam]jmp .finish

.wmcreate:

xor eax,eax

jmp .finish

.wmkeydown:

cmp [wparam],VK_ESCAPEjne .finish

.wmdestroy:

cominvkDDraw,RestoreDisplayModecominvkDDraw,Release

invokePostQuitMessage,0xor eax,eax

jmp .finish

.wmactivate:

mov eax,[wparam]mov [active],aljmp .finish

.wmsetcursor:

invokeSetCursor,0xor eax,eax

jmp .finish

.wmmousemove:

movsx eax,word[lparam]mov [x],eax

movsx eax,word[lparam+2]mov [y],eax

.finish:

pop ediesiebxret

endp

section '.data' data readablewriteable

_titledb 'flat assembler DirectDrawapplication',0

_class db'FDDRAW32',0

_error db'Error',0

_startup_error db 'Startupfailed.',0

_ddraw_error db 'Direct Draw initializationfailed.',0

_open_error db 'Failed opening datafile.',0picture db'DDRAW.GIF',0

section '.bss' readablewriteable

hinstance dd?hwnddd?

wcWNDCLASS

msgMSG

ddsdDDSURFACEDESC

ddscapsDDSCAPS

DDrawDirectDrawDDSPrimaryDirectDrawSurfaceDDSBackDirectDrawSurface

DDSPictureDirectDrawSurfaceDDPaletteDirectDrawPalette

bytes_count dd?last_tickdd?frame db?activedb?

LZW_bitsdb?

LZW_table rd(0F00h-2)*2buffer rb40000h

rectRECTx dd?

y dd?

section '.idata' import datareadablelibrarykernel,'KERNEL32.DLL',\

user,'USER32.DLL',\ddraw,'DDRAW.DLL'

importkernel,\GetModuleHandleA,'GetModuleHandleA',\CreateFileA,'CreateFileA',\ReadFile,'ReadFile',\CloseHandle,'CloseHandle',\GetTickCount,'GetTickCount',\ExitProcess,'ExitProcess'

importuser,\

RegisterClassA,'RegisterClassA',\CreateWindowExA,'CreateWindowExA',\DestroyWindow,'DestroyWindow',\

DefWindowProcA,'DefWindowProcA',\GetMessageA,'GetMessageA',\PeekMessageA,'PeekMessageA',\TranslateMessage,'TranslateMessage',\DispatchMessageA,'DispatchMessageA',\LoadCursorA,'LoadCursorA',\LoadIconA,'LoadIconA',\SetCursor,'SetCursor',\MessageBoxA,'MessageBoxA',\PostQuitMessage,'PostQuitMessage',\WaitMessage,'WaitMessage'

importddraw,\DirectDrawCreate,'DirectDrawCreate'

Задание2.Оформитьотчет.