Программирование и основы алгоритмизации
Mov wcl. style, CS_HREDRAW+CS_VREDRAW ;полная перерисовка. Extrn RegisterClassExA: PROC ;регистрация класса окна. Extrn DefWindowProcA: PROC ;обработчик по умолчанию. Uses ebx, edi, esi; регистры должны сохраняться. Extrn GetModuleHandleA: PROC ;дескриптор класса окна. Hedt1 dd 0 ;дескриптор поля редактирования. Extrn TranslateMessage: PROC ;обнаружение сообщения. Mov dword ptr wcl. lpszMenuName… Читать ещё >
Программирование и основы алгоритмизации (реферат, курсовая, диплом, контрольная)
Министерство образования Российской Федерации ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Кафедра Автоматики и управления
Пояснительная записка к курсовому проекту
По дисциплине:
Программирование и основы алгоритмизации
Вариант № 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 4 000 0000h + 1 000 0000h
;WSCHILD+WS_VISIBLE
STYLEDT equ 4 000 0000h + 1 000 0000h + 80 0000h + 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 ;стандартное приложение 32 512
push 0
call LoadIconA
mov wcl. hIcon, eax
push IDC_ARROW ;стандартный курсор стрелка 32 512
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
2. Схема алгоритма
Вывод результата работы
3. Проверка правильности программы
1)
2)
3)
4)
Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы.