Ìèíèñòåðñòâî îáðàçîâàíèÿ Ðîññèéñêîé Ôåäåðàöèè
ÞÆÍÎ-ÓÐÀËÜÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ
Êàôåäðà Àâòîìàòèêè è óïðàâëåíèÿ
Ïîÿñíèòåëüíàÿ çàïèñêà ê êóðñîâîìó ïðîåêòó
Ïî äèñöèïëèíå:
Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè
Âàðèàíò ¹ 1
Ïðîâåðèë:
äîöåíò êàôåäðû
Âñòàâñêàÿ Å.Â.
“____”_____________2007ã
Âûïîëíèë:
ñòóäåíò ãðóïïû ÏÑ-164
Ëûñåíêî Ä.Ã.
×åëÿáèíñê
2007 ã.
1. Ïîñòàíîâêà çàäà÷è. 3
2. Ìåòîä ðåøåíèÿ. 3
3. Òåêñò ïðîãðàììû.. 4
4. Ñõåìà àëãîðèòìà. 12
5. Âûâîä ðåçóëüòàòà ðàáîòû.. 14
6. Ïðîâåðêà ïðàâèëüíîñòè ïðîãðàììû.............................................. 14
Ïîñòàíîâêà çàäà÷è
Äàíû öåëûå ÷èñëà a, b è n. Âû÷èñëèòü.
Ïîäêëþ÷àåì ôàéë windowA.inc, â êîòîðîì áóäóò ñîäåðæàòüñÿ áàçîâûå ñòðóêòóðû è êîíñòàíòû Win32. Çàòåì â ïðîöåäóðå start ïåðâîíà÷àëüíî âûçûâàåì ôóíêöèè Win32 API, ïîñëå ÷åãî ïðîèñõîäèò ðåãèñòðàöèÿ îêíà (îïðåäåëåíèÿ êëàññà îêíà è ðåãèñòðàöèÿ åãî â ñèñòåìå). Çàòåì ñîçäàåì è îòîáðàæàåì, ñîáñòâåííî, ñàìî îêíî. Ïîòîì çàïóñêàåòñÿ öèêë îáðàáîòêè ñîîáùåíèÿ, êîòîðûå áóäóò ïîñûëàòüñÿ ÎÑ ïðîãðàììå è îáðàáàòûâàòüñÿ â îòäåëüíîé ïðîöåäóðå WindowProc è çàòåì ñîáñòâåííî âûõîä èç ïðîãðàììû.
 ïðîöåäóðå îáðàáîòêå ñîîáùåíèé, åñëè íàæàòà êëàâèøà «Âû÷èñëèòü», òî ñ÷èòûâàåòñÿ çíà÷åíèå èç ïîëÿ ðåäàêòèðîâàíèÿ, ïðåîáðàçîâûâàåòñÿ â ÷èñëîâîé ôîðìàò, ïðîèçâîäÿòñÿ íóæíûå âû÷èñëåíèÿ è âûâîäèòñÿ íà ýêðàí
Òåêñò ïðîãðàììû
STYLBTN equ 40000000h + 10000000h
;WSCHILD+WS_VISIBLE
STYLEDT equ 40000000h + 10000000h + 800000h + 10000h
;Ïðèìåð êàðêàñíîãî ïðèëîæåíèÿ äëÿ Win32
.486
locals
.model flat,STDCALL
include windowA.inc
includelib imp32i.lib
extrn GetModuleHandleA:PROC ;äåñêðèïòîð êëàññà îêíà
extrn LoadIconA:PROC ;äåñêðèïòîð ïèêòîãðàììû
extrn LoadCursorA:PROC ;äåñêðèïòîð êóðñîðà
extrn GetStockObject:PROC ;äåñêðèïòîð êèñòè
extrn RegisterClassExA:PROC ;ðåãèñòðàöèÿ êëàññà îêíà
extrn CreateWindowExA:PROC ;ñîçäàíèå ýêçåìïëÿðà îêíà
extrn ShowWindow:PROC ;îòîáðàæåíèå îêíà
extrn UpdateWindow:PROC ;ïåðåðèñîâêà îêíà
extrn GetMessageA:PROC ;ïîëó÷åíèå ñîîáùåíèÿ
extrn TranslateMessage:PROC ;îáíàðóæåíèå ñîîáùåíèÿ
extrn DispatchMessageA:PROC ;ïåðåäà÷à ñîîáùåíèÿ
;îêîííîé ôóíêöèè
extrn ExitProcess:PROC ;çàâåðøåíèå ïðîöåäóðû
extrn BeginPaint:PROC ;íà÷àëî ïåðåðèñîâêè
extrn EndPaint:PROC ;êîíåö ïåðåðèñîâêè
extrn TextOutA:PROC ;âûâîä òåêñòà
extrn PostQuitMessage:PROC
extrn DefWindowProcA:PROC ;îáðàáîò÷èê ïî óìîë÷àíèþ
extrn MessageBoxA:PROC
extrn SendMessageA:PROC
extrn GetDC:PROC
extrn ReleaseDC:PROC
public WindowProc
.data
hwnd dd 0 ; äåñêðèïòîð ýêçåìïëÿðà îêíà
hInst dd 0 ; äåñêðèïòîð êëàññà îêíà
hdc dd 0
;
hedt1 dd 0 ;äåñêðèïòîð ïîëÿ ðåäàêòèðîâàíèÿ
hbtn dd 0 ;äåñêðèïòîð êíîïêè
hh1 dd 0
hh2 dd 0
hh3 dd 0
hh4 dd 0
hbtn1 dd 0
hbtn2 dd 0
CPBUT db '&Ïîñ÷èòàòü',0
CPBUT2 db 'Â&ûõîä',0
CLSBTN db 'BUTTON',0
CPEDT db '',0
CLSEDT db 'EDIT',0
TEXT db ' '
TEXTA db ' '
TEXTB db 'ðåçóëüòàò: '
TEXTLEN = $-TEXT
ten dw 10
temp dw 0
a dd ?
b dd ?
n dd ?
wcl WNDCLASSEX <?> ;ñòðóêòóðà äëÿ ðåãèñòðàöèè êëàññà
; îêíà
message MSG <?> ;ñòðóêòóðà äëÿ ðåãèñòðàöèè ñîîáùåíèé
szClassName db 'Ïðèëîæåíèå Win32',0
szTitleName db 'Êóðñà÷ Ëûñåíêî Ä. ÏÑ-164',0
MesWindow db 'Ââåäèòå a,b è n,'
MesWindowLen = $-MesWindow
ps PAINTSTRUCT <?>
.code
start proc near
;Ïîëó÷åíèå äåñêðèïòîðà êëàññà îêíà
push 0;
call GetModuleHandleA
mov hInst,eax
WinMain:
;äëÿ íà÷àëà èíèöèàëèçèðóåì ïîëÿ ñòðóêòóðû WndClassEx
mov wcl.cbSize,type WNDCLASSEX
mov wcl.style, CS_HREDRAW+CS_VREDRAW ;ïîëíàÿ ïåðåðèñîâêà
mov wcl.lpfnWndProc,offset WindowProc
mov wcl.cbClsExtra,0
mov wcl.cbWndExtra,0
mov eax,hInst
mov wcl.hInstance,eax
push IDI_APPLICATION ;ñòàíäàðòíîå ïðèëîæåíèå 32512
push 0
call LoadIconA
mov wcl.hIcon,eax
push IDC_ARROW ;ñòàíäàðòíûé êóðñîð ñòðåëêà 32512
call LoadCursorA
mov wcl.hCursor,eax
;îïðåäåëèì öâåò ôîíà îêíà
push LTGRAY_BRUSH ;1
call GetStockObject
mov eax,5
mov wcl.hbrBackground,eax
mov dword ptr wcl.lpszMenuName,0 ;áåç ãëàâíîãî ìåíþ
mov dword ptr wcl.lpszClassName,offset szClassName
;èìÿ êëàññà îêíà
mov wcl.hIconSm,0
;ðåãèñòðèðóåì êëàññ îêíà
push offset wcl
call RegisterClassExA
;ñîçäàåì îêíî:
push 0 ;lpParam
push hInst ;hInstance
push 0 ;menu
push 0 ;parent hwnd
push 200 ;âûñîòà îêíà
push 300 ;øèðèíà îêíà
push 300 ;êîîðäèíàòà y ë.â. óãëà îêíà
push 300 ;êîîðäèíàòà x ë.â. óãëà
push WS_OVERLAPPEDWINDOW ;ñòèëü îêíà
push offset szTitleName ;Ñòðîêà çàãîëîâêà îêíà
push offset szClassName ;èìÿ êëàññà îêíà
push 0 ;äîïîëíèòåëüíûå ñòèëè
call CreateWindowExA
mov hwnd,eax ;hwnd - äåñêðèïòîð îêíà
;ïîêàçàòü îêíî:
push SW_SHOWNORMAL ;1
push hwnd
call ShowWindow
;ïåðåðèñîâûâàåì ñîäåðæèìîå îêíà
call UpdateWindow
;çàïóñêàåì öèêë ñîîáùåíèé:
cycl_msg:
push NULL
push offset message
call GetMessageA
cmp ax,0
je end_cycl_msg
;òðàíñëÿöèÿ ââîäà ñ êëàâèàòóðû
call TranslateMessage
;ïåðåäà÷à ñîîáùåíèÿ îêîííîé ôóíêöèè
call DispatchMessageA
jmp cycl_msg
end_cycl_msg:
;âûõîä èç ïðèëîæåíèÿ
call ExitProcess
start endp
;Îêîííàÿ ôóíêöèÿ WindowProc äëÿ îáðàáîòêè ñîîáùåíèé
WindowProc proc
arg @@hwnd:DWORD, @@mes:DWORD, @@wparam:DWORD, @@lparam:DWORD
uses ebx,edi, esi ; ðåãèñòðû äîëæíû ñîõðàíÿòüñÿ
local @@hdc:DWORD
cmp @@mes,WM_DESTROY
je wmdestroy
cmp @@mes,WM_CREATE
je wmcreate
cmp @@mes,WM_PAINT
je wmpaint
cmp @@mes, WM_COMMAND
je wmcommand
jmp default
wmcreate: ;ñîçäàíèå îêíà
mov eax,0
;;;;ïîëå1
push hInst
push @@hwnd
push 20
push 35
push 50
push 10
push STYLEDT
push offset CPEDT
push offset CLSEDT
mov hh1,eax
;;; ïîëå2
mov hh2,eax
;;;;;;3
push 90
mov hh3,eax
;;;;;
push 80
push STYLBTN ;STYLBTN
push offset CPBUT
push offset CLSBTN
mov hbtn,eax
push 100
push offset CPBUT2
mov hbtn2,eax
;âîçâðàùàåìîå çíà÷åíèå 0
jmp exit_wndproc
wmcommand:
mov eax, hbtn
cmp @@lparam,eax
je calc
mov eax, hbtn2
je res
wmnodestroy:
res:
jmp wmdestroy
wmpaint:
push offset ps
call BeginPaint
mov @@hdc,eax
push MesWindowLen
push offset MesWindow
push @@hdc
call TextOutA
;îñâîáîäèòü êîíòåêñò
call EndPaint
mov eax,0 ;âîçâðàùàåìîå çíà÷åíèå 0
wmdestroy: ;ïîñëàòü ñîîáùåíèå WM_QUIT
call PostQuitMessage
default:
;îáðàáîòêà ïî óìîë÷àíèþ
push @@lparam
push @@wparam
push @@mes
call DefWindowProcA
calc:
;ñ÷èòûâàåì ïîëå 1
push offset TEXTA
push 150
push WM_GETTEXT
push hh1
call SendMessageA
call StringToDig
mov a,eax
;ïîëå 2
push hh2
mov b,eax
;ïîëå 3
push hh3
mov n,eax
mov ecx,n
mov eax,1d
repeat:
imul a
loop repeat
imul b
aam
or ax,3030h
mov [TEXTB+12],ah
mov [TEXTB+13],al
call GetDC
push 18
push offset TEXTB
push 120
exit_wndproc:
ret
WindowProc endp
StringToDig proc near
ARG @@TEXT:DWORD
mov esi,@@TEXT
mov edx,0
mov dl,[esi]
cmp dl,'-'
jne N
mov temp,1
inc esi
N: cmp dl,'0'
jl MRET
cmp dl,'9'
jg MRET
and dl,0Fh ; ASCII->BCD
add eax,edx
mul ten
cmp dl,'0'
jl MDIV
jg MDIV
; mul ten
and dl,0Fh
jmp MRET
MDIV: div ten
MRET:
cmp temp,1
jne n1
imul eax,-1
mov temp,0
n1: ret
StringToDig endp
end start
Âûâîä ðåçóëüòàòà ðàáîòû
1)
2)
3)
4)
Äàííûå, ïîëó÷åííûå â ðåçóëüòàòå âû÷èñëåíèé, ñîâïàäàþò ñ òåìè, ÷òî áûëè ïîëó÷åíû â ðåçóëüòàòå âûïîëíåíèÿ ïðîãðàììû.