Министерство образования Российской Федерации
ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра Автоматики и управления
Пояснительная записка к курсовому проекту
По дисциплине:
Программирование и основы алгоритмизации
Вариант № 1
Проверил:
доцент кафедры
Вставская Е.В.
“____”_____________2007г
Выполнил:
студент группы ПС-164
Лысенко Д.Г.
“____”_____________2007г
Челябинск
2007 г.
Содержание:
6. Проверка правильности программы
Постановка задачи
Даны целые числа 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
push 0
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
;перерисовываем содержимое окна
push hwnd
call UpdateWindow
;запускаем цикл сообщений:
cycl_msg:
push 0
push 0
push NULL
push offset message
call GetMessageA
cmp ax,0
je end_cycl_msg
;трансляция ввода с клавиатуры
push offset message
call TranslateMessage
;передача сообщения оконной функции
push offset message
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 offset CPEDT
push offset CLSEDT
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 offset CPEDT
push offset CLSEDT
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 offset CPEDT
push offset CLSEDT
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 offset CPBUT
push offset CLSBTN
push 0
call CreateWindowExA
mov hbtn,eax
mov eax,0
push 0
push hInst
push 0
push @@hwnd
push 20
push 80
push 80
push 100
push STYLBTN ;STYLBTN
push offset CPBUT2
push offset CLSBTN
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 offset MesWindow
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 offset TEXTA
push 150
push WM_GETTEXT
push hh1
call SendMessageA
push offset TEXTA
call StringToDig
mov a,eax
;поле 2
push offset TEXTA
push 150
push WM_GETTEXT
push hh2
call SendMessageA
push offset TEXTA
call StringToDig
mov b,eax
;поле 3
push offset TEXTA
push 150
push WM_GETTEXT
push hh3
call SendMessageA
push offset TEXTA
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 offset TEXTB
push 120
push 10
push @@hdc
call TextOutA
exit_wndproc:
ret
WindowProc endp
StringToDig proc near
ARG @@TEXT:DWORD
mov esi,@@TEXT
mov eax,0
mov edx,0
mov dl,[esi]
cmp dl,'-'
jne N
mov temp,1
inc esi
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
StringToDig endp
end start
Схема алгоритма
Вывод результата работы
Проверка правильности программы
1)
2)
3)
4)
Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы.