Министерствообразования Российской Федерации
ЮЖНО-УРАЛЬСКИЙГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КафедраАвтоматики и управления
Пояснительнаязаписка к курсовому проекту
Подисциплине:
Программированиеи основы алгоритмизации
Вариант № 1
Проверил:
доценткафедры
ВставскаяЕ.В.
“____”_____________2007г
Выполнил:
студентгруппы ПС-164
Лысенко Д.Г.
“____”_____________2007г
Челябинск
2007 г.
Содержание:
1. Постановказадачи. 3
2. Методрешения. 3
3. Текстпрограммы… 4
4. Схемаалгоритма. 12
5. Выводрезультата работы… 14
6. Проверкаправильности программы… 14
Постановка задачи
Даны целыечисла a, bи n. Вычислить/>.
1. Методрешения
Подключаем файл windowA.inc, в котором будут содержаться базовые структуры иконстанты Win32. Затем в процедуре start первоначально вызываем функции Win32 API, после чего происходит регистрация окна (определениякласса окна и регистрация его в системе). Затем создаем и отображаем,собственно, само окно. Потом запускается цикл обработки сообщения, которыебудут посылаться ОС программе и обрабатываться в отдельной процедуре WindowProc и затем собственно выход изпрограммы.
В процедуре обработкесообщений, если нажата клавиша «Вычислить», то считывается значение из поляредактирования, преобразовывается в числовой формат, производятся нужныевычисления и выводится на экран
Текст программы
STYLBTN equ 40000000h + 10000000h
;WSCHILD+WS_VISIBLE
STYLEDT equ 40000000h+ 10000000h + 800000h + 10000h
; Пример каркасногоприложения для Win32
.486
locals
.modelflat,STDCALL
includewindowA.inc
includelibimp32i.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,typeWNDCLASSEX
mov wcl.style,CS_HREDRAW+CS_VREDRAW; полная перерисовка
mov wcl.lpfnWndProc,offsetWindowProc
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
push 0
call LoadCursorA
mov wcl.hCursor,eax
; определим цвет фона окна
push LTGRAY_BRUSH ;1
call GetStockObject
moveax,5
mov wcl.hbrBackground,eax
mov dword ptrwcl.lpszMenuName,0 ; без главного меню
mov dwordptr wcl.lpszClassName,offset szClassName
; имя классаокна
mov wcl.hIconSm,0
; регистрируем класс окна
push offset wcl
call RegisterClassExA
; создаем окно:
push 0 ;lpParam
push hInst ;hInstance
push 0 ;menu
push 0 ;parenthwnd
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
; перерисовываемсодержимое окна
push hwnd
call UpdateWindow
; запускаемцикл сообщений:
cycl_msg:
push 0
push 0
push NULL
push offsetmessage
call GetMessageA
cmp ax,0
je end_cycl_msg
; трансляция ввода склавиатуры
push offset message
call TranslateMessage
; передачасообщения оконной функции
push offsetmessage
call DispatchMessageA
jmp cycl_msg
end_cycl_msg:
; выход из приложения
push NULL
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 0
push hInst
push 0
push @@hwnd
push 20
push 35
push 50
push 10
push STYLEDT
push offsetCPEDT
push offsetCLSEDT
push 0
call CreateWindowExA
mov hh1,eax
mov eax,0
;;; поле2
push 0
push hInst
push 0
push @@hwnd
push 20
push 35
push 50
push 50
push STYLEDT
push offsetCPEDT
push offsetCLSEDT
push 0
call CreateWindowExA
mov hh2,eax
mov eax,0
;;;;;;3
push 0
push hInst
push 0
push @@hwnd
push 20
push 35
push 50
push 90
push STYLEDT
push offsetCPEDT
push offsetCLSEDT
push 0
call CreateWindowExA
mov hh3,eax
mov eax,0
;;;;;
push 0
push hInst
push 0
push @@hwnd
push 20
push 80
push 80
push 10
push STYLBTN ;STYLBTN
push offsetCPBUT
push offsetCLSBTN
push 0
call CreateWindowExA
mov hbtn,eax
mov eax,0
push 0
push hInst
push 0
push @@hwnd
push 20
push 80
push 80
push100
push STYLBTN ;STYLBTN
push offsetCPBUT2
push offsetCLSBTN
push 0
call CreateWindowExA
mov hbtn2,eax
mov eax,0
; возвращаемоезначение 0
jmp exit_wndproc
wmcommand:
mov eax, hbtn
cmp @@lparam,eax
je calc
mov eax,hbtn2
cmp @@lparam,eax
je res
wmnodestroy:
mov eax,0
jmp exit_wndproc
res:
jmp wmdestroy
wmpaint:
push offset ps
push @@hwnd
call BeginPaint
mov @@hdc,eax
push MesWindowLen
push offsetMesWindow
push 20
push 10
push @@hdc
call TextOutA
; освободить контекст
push offset ps
push @@hdc
call EndPaint
mov eax,0; возвращаемое значение 0
jmp exit_wndproc
wmdestroy:; послать сообщение WM_QUIT
push 0
call PostQuitMessage
mov eax,0; возвращаемое значение 0
jmp exit_wndproc
default:
; обработка по умолчанию
push @@lparam
push @@wparam
push @@mes
push @@hwnd
call DefWindowProcA
jmp exit_wndproc
calc:
; считываемполе 1
push offsetTEXTA
push 150
push WM_GETTEXT
push hh1
call SendMessageA
push offsetTEXTA
call StringToDig
mov a,eax
; поле2
push offsetTEXTA
push 150
push WM_GETTEXT
push hh2
call SendMessageA
push offsetTEXTA
call StringToDig
mov b,eax
; поле 3
push offsetTEXTA
push 150
push WM_GETTEXT
push hh3
call SendMessageA
push offsetTEXTA
call StringToDig
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
push @@hwnd
call GetDC
mov @@hdc,eax
push 18
push offsetTEXTB
push 120
push 10
push @@hdc
call TextOutA
exit_wndproc:
ret
WindowProc endp
StringToDigproc near
ARG@@TEXT:DWORD
mov esi,@@TEXT
mov eax,0
mov edx,0
mov dl,[esi]
cmp dl,'-'
jne N
movtemp,1
incesi
mov dl,[esi]
N: cmp dl,'0'
jl MRET
cmp dl,'9'
jg MRET
and dl,0Fh ; ASCII->BCD
add eax,edx
mul ten
inc esi
mov dl,[esi]
cmp dl,'0'
jl MDIV
cmp dl,'9'
jg MDIV
; mul ten
and dl,0Fh
add eax,edx
jmp MRET
MDIV: div ten
MRET:
cmp temp,1
jne n1
imul eax,-1
mov temp,0
n1: ret
StringToDigendp
end start
2. Схемаалгоритма
/>
/>
/>/>Вывод результатаработы
/>/>
/>/>3. Проверкаправильности программы
1) />
2) />
3) />
4) />
Данные, полученные врезультате вычислений, совпадают с теми, что были получены в результатевыполнения программы.