Программирование и основы алгоритмизации

Лабораторная работа

Министерство образования Российской Федерации

ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Кафедра Автоматики и управления

Пояснительная записка к курсовому проекту

По дисциплине:

Программирование и основы алгоритмизации

Вариант № 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

.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


2.         Схема алгоритма


Вывод результата работы

3.         Проверка правильности программы

1)

2)

3)

4)

Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы.

Похожие работы