Sprawozdanie z ćwiczenia numer 4
Data wykonania ćwiczenia: 2009-12-07
Temat ćwiczenia:
Prosty program asemblerowy w środowisku Windows
Autor: Jarosław Jureczko
Program stworzony za pomocą Prostart
Zmiany przeprowadzone w głównym pliku .ASM (zaznaczone NA CZERWONO )
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
.486 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include Przyklad.inc ; local includes for this file
.code
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
invoke InitCommonControls
; ------------------
; set global values
; ------------------
mov hInstance, rv(GetModuleHandle, NULL)
mov CommandLine, rv(GetCommandLine)
mov hIcon, rv(LoadIcon,hInstance,500)
mov hCursor, rv(LoadCursor,NULL,IDC_ARROW)
mov sWid, rv(GetSystemMetrics,SM_CXSCREEN)
mov sHgt, rv(GetSystemMetrics,SM_CYSCREEN)
call Main
invoke ExitProcess,eax
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
Main proc
LOCAL Wwd:DWORD,Wht:DWORD,Wtx:DWORD,Wty:DWORD
STRING szClassName,"ProStart_Class"
; --------------------------------------------
; register class name for CreateWindowEx call
; --------------------------------------------
invoke RegisterWinClass,ADDR WndProc,ADDR szClassName,
hIcon,hCursor,COLOR_BTNFACE+1
; -------------------------------------------------
; macro to autoscale window co-ordinates to screen
; percentages and centre window at those sizes.
; -------------------------------------------------
AutoScale 75, 70
invoke CreateWindowEx,WS_EX_LEFT or WS_EX_ACCEPTFILES,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInstance,NULL
mov hWnd,eax
; ---------------------------
; macros for unchanging code
; ---------------------------
DisplayMenu hWnd,600
DisplayWindow hWnd,SW_SHOWNORMAL
call MsgLoop
ret
Main endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,
Icon:DWORD, Cursor:DWORD, bColor:DWORD
LOCAL wc:WNDCLASSEX
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_BYTEALIGNCLIENT or \
CS_BYTEALIGNWINDOW
m2m wc.lpfnWndProc, lpWndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInstance
m2m wc.hbrBackground, bColor
mov wc.lpszMenuName, NULL
m2m wc.lpszClassName, lpClassName
m2m wc.hIcon, Icon
m2m wc.hCursor, Cursor
m2m wc.hIconSm, Icon
invoke RegisterClassEx, ADDR wc
ret
RegisterWinClass endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
MsgLoop proc
LOCAL msg:MSG
push esi
push edi
xor edi, edi ; clear EDI
lea esi, msg ; Structure address in ESI
jmp jumpin
StartLoop:
invoke TranslateMessage, esi
; --------------------------------------
; perform any required key processing here
; --------------------------------------
invoke DispatchMessage, esi
jumpin:
invoke GetMessage,esi,edi,edi,edi
test eax, eax
jnz StartLoop
mov eax, msg.wParam
pop edi
pop esi
ret
MsgLoop endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL var :DWORD
LOCAL caW :DWORD
LOCAL caH :DWORD
LOCAL fname :DWORD
LOCAL patn :DWORD
LOCAL Rct :RECT
LOCAL buffer1[260]:BYTE ; these are two spare buffers
LOCAL buffer2[260]:BYTE ; for text manipulation etc..
Switch uMsg
Case WM_COMMAND
Switch wParam
;======== toolbar commands ========
Case 50
fn MessageBox,hWin,"Klawisz_nr_1", \
ADDR szDisplayName,MB_OK
Case 51
fn MessageBox,hWin,"Klawisz_nr_2", \
ADDR szDisplayName,MB_OK
Case 52
fn MessageBox,hWin,"Klawisz_nr_3", \
ADDR szDisplayName,MB_OK
Case 53
fn MessageBox,hWin,"Klawisz_nr_4", \
ADDR szDisplayName,MB_OK
Case 54
fn MessageBox,hWin,"Klawisz_nr_5", \
ADDR szDisplayName,MB_OK
Case 55
fn MessageBox,hWin,"Klawisz_nr_6", \
ADDR szDisplayName,MB_OK
;======== menu commands ========
Case 1001
sas patn, "Wszystkie pliki !!",0,"*.*",0
mov fname, OpenFileDlg(hWin,hInstance,"Open File",patn)
cmp BYTE PTR [eax], 0
jne @F
return 0
@@:
; ---------------------------------
; perform your file open code here
; ---------------------------------
invoke MessageBox,hWin,fname,ADDR szDisplayName,MB_OK
Case 1002
sas patn, "wszystkie pliki !!!",0,"*.*",0
mov fname, SaveFileDlg(hWin,hInstance,"Save File As ...",patn)
cmp BYTE PTR [eax], 0
jne @F
return 0
@@:
; ---------------------------------
; perform your file save code here
; ---------------------------------
invoke MessageBox,hWin,fname,ADDR szDisplayName,MB_OK
Case 1010
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
Case 1900
ShellAboutBox hWin,hIcon,\
"About Prostart 4 Template#Windows Application",\
"Prostart 4 Template",13,10,"Copyright © MASM32 1998-2005"
;====== end menu commands ======
Endsw
Case WM_DROPFILES
mov fname, DropFileName(wParam)
fn MessageBox,hWin,fname,"WM_DROPFILES",MB_OK
Case WM_CREATE
invoke Do_ToolBar,hWin
invoke Do_Status,hWin
Case WM_SYSCOLORCHANGE
invoke Do_ToolBar,hWin
Case WM_SIZE
invoke SendMessage,hToolBar,TB_AUTOSIZE,0,0
invoke MoveWindow,hStatus,0,0,0,0,TRUE
Case WM_PAINT
invoke Paint_Proc,hWin
return 0
Case WM_CLOSE
Case WM_DESTROY
invoke PostQuitMessage,NULL
return 0
Endsw
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
TopXY proc wDim:DWORD, sDim:DWORD
mov eax, [esp+8]
sub eax, [esp+4]
shr eax, 1
ret 8
TopXY endp
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
Paint_Proc proc hWin:DWORD
LOCAL hDC :DWORD
LOCAL btn_hi :DWORD
LOCAL btn_lo :DWORD
LOCAL Rct :RECT
LOCAL Ps :PAINTSTRUCT
mov hDC, rv(BeginPaint,hWin,ADDR Ps)
; ----------------------------------------
mov btn_hi, rv(GetSysColor,COLOR_BTNHIGHLIGHT)
mov btn_lo, rv(GetSysColor,COLOR_BTNSHADOW)
; ----------------------------------------
invoke EndPaint,hWin,ADDR Ps
ret
Paint_Proc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start
ZMIANY DOKONANE W PLIKU RSRC(polskie „otwiera”, „zapisuje” itd…) :
ZMIANY DOKONANE w PLIKU TOOLBAR.ASM
PRZED :
PO:
Program Wygenerowany przez Prostat miał na celu wyświetlić okno z 9 przyciskami i menu górnym z pozycjami „file” oraz „help”.
Zmiany dokonane w wyżej wymienionych plikach zmieniły postać wyświetlonego okna :
-6 przycisków(bez przerw miedzy przyciskami”
-wartość wyświetlanej komórki po kliknięciu na przycisk „klawisz_nr_X”
-Polskie Menu
WYNIK :
WNIOSKI:
Za pomocą Prostat możemy szybko stworzyć prosty program Asemblerowy.
Do zmian przeprowadzanych na programie wygenerowanym za pomocą prostat nie powinniśmy zbytnio ingerować w główny plik ASM.
Do zmian używamy plików RSRC oraz Toolbar.ASM za pomocą których możemy swobodnie zmieniać wygląd naszego okna bądź też innych elementów które stworzymy za pomocą prostart.
Laboratorium Języki Asemblerowe |
||||||
Rok akademicki |
Termin |
Rodzaj studiów |
Kierunek |
Prowadzący |
Grupa |
Sekcja |
2009/2010 |
Poniedziałek |
WSZ |
INF |
EW |
1 |
2 |
|
17.45 - 19.15 |
|
|
|
|
|