Программирование и основы алгоритмизации
Министерство
образования Российской Федерации
ЮЖНО-УРАЛЬСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра
Автоматики и управления
Пояснительная
записка к курсовому проекту
По
дисциплине:
Программирование
и основы алгоритмизации
Вариант
№ 1
Проверил:
доцент
кафедры
Вставская
Е.В.
“____”_____________2007г
Выполнил:
студент
группы ПС-164
Лысенко
Д.Г.
“____”_____________2007г
Челябинск
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 ;дескриптор поля редактирования
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 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 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
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)
Данные,
полученные в результате вычислений, совпадают с теми, что были получены в
результате выполнения программы.