Информатика, программирование: График функции по Assembler’у, Лабораторная работа

Министерство Образования РФ

Южно-Уральский Государственный Университет

Приборостроительный факультет

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

Курсовая работа по Assembler’у.

Выполнил: Копылов Е.Е.

Группа: ПС-116

Проверила: Вставская Е.В.

Челябинск 2008 год


Задание.

Нарисовать график X=3sint+sin5t; Y=2cos3t+sint


Описание решения задачи.

Подключается файл win.inc, к котором хранятся некоторые константы, используемые в программе. В сегменте данных объявляются переменные: декриптор окна консоли, дескриптор совместимого окна консоли, дескриптор приложения, название окна консоли, дескриптор контекста окна, ширина, высота, x, y, t, cons, deg_rad=180, offsetX, offsetY (смещения начала отсчета графика относительно осей Оx и Oy),scaleX, scaleY (масштаб по X и Y).

В сегменте кода вызывается функция GetModuleHandle, при помощи которой получаем дескриптор приложения, после чего помещаем его в eax. Далее заполняем структуру окна стиль. Подключаем процедуру обработки сообщений. Загружаем иконку и курсор с помощью вызова функций LoadIcon и LoadCursor. Задаем цвет фона окна с помощью функции CreateSolidBrush. Регестрируем класс окна с помощью функции RegisterClass. Далее создаем окно зарегестрированного класса с помощью функции CreateWindowEx. Сравниваем eax с нулем. Если он равен 0, то переходим на метку END_LOOP. Помещаем дескриптор окна в регистр eax. Отображаем созданное окно с помощью функции ShowWindow и перерисовываем видимую часть окна при помощи UpdateWindow. Далее следует цикл обработки сообщений, после которого вызывается функция ExitProcess.

После главной функции следует процедура окна. Полученное сообщение сравнивается с сообщениями WM_DESTROY, WM_CREATE, WM_SIZE, WM_PAINT. В случае соответствия следует переход на соответствующую метку.

WMSIZE: Дескриптор совместимого окна консоли сравнивается с 0 и если не равен, то переходим на метку WMCREATE. В противном случае удаляем контекст окна.

WMCREATE: Передаем дескриптор окна и помещаем его в eax. Создаем совместимый контекст окна с помощью функции CreateCompatibleDC и помещаем дескриптор совместимого контекста в регистр eax. Получаем размер окна при его изменении с помощью функции GetWindowRect. Находим высоту и ширину данного размера окна. Создаем карту бит для данного контекста окна с помощью функции CreateCompatibleBitmap. Выбираем объект с помощью функции SelectObject. Задаем цвет фона, а также рисуем прямоугольник с помощью выбранной кисти. Задаем цвет пера при помощи функции CreatePen. Помещаем дескриптор пера в регистр eax и выбираем объект. Помещаем в offsetY максимальную высоту, видимую на экране. Аналогичные действия проделываем и с осью Ох. Рисуем горизонтальную и вертикульную оси координат. Создаем перо и выбираем цвет.

Помещаем в ScaleX и ScaleY значения (width-16)/4 и (height-54)/2. Это необходимо для более пропорционального расположения графика в окне. Помещаем в ecx 360, на метке L загружаем ecx в стек. Помещаем в cons 5. Загружаем последовательно в стек t и PI. Перемножаем их и делим на deg_rad, в которой хранится значение 180. Загружаем в стек cons и перемножаем st(0) и st(1). Вычисляем синус. Это sin(5t). Подобные операции проделываем, чтобы получить 3sint. Затем складываем 3sint и sin (5t). Умножаем результат на ScaleX и прибавляем к offsetX. Заносим в стек 2 и умножаем на вычисленное cos(3t), добавляем sint. Умножаем это на ScaleY и прибавляем к offsetY. Уыеличиваем t на единицу. Проводим линию для данных значений X и Y. Выгружаем ecx из стека и сравниваем его с 0. Если равно, то идем на метку М. В противном случае уменьщаем ecx на единицу и переходим снова на метку L. На метке М передаем полученные данные в виртуальное окно и даем команду перерисовки. Задаем цвет фона и букв с помощью функции SetBkColor. Помещаем в eax mess_len. Выводим текст названия функции на экран. Обнуляем eax. Переходим на метку FINISH.

WMPAINT: Перерисовываем окно с помощью функции BeginPaint. Помещаем дескриптор окна в eax. Копируем содержимое виртуального окна в реальное. Заканчиваем перерисовку окна с помощью функции EndPaint. Обнуляем eax. Переходим на метку FINISH.

WMDESTROY: Удаляем контексты окна. При получении сообщения WM_QUIT вызываем функцию PostQuitMessage. Обнуляем eax. Переходим на метку FINISH.

DEFWNDPROC: Вызываем обработчик сообщений по умолчанию.

FINISH: Передаем управление вызывающей функции, завершаем данную функцию.


Текст программы.

.586

.model flat,stdcall

RGBW    equ 00D4D0C8h     ; цвет фона в окне

include win.inc

.data

         hwnd     dd 0

    hinst      dd 0

         TITL           db "Курсовой_Копылов_ПС-116",0

         CLASSNAME     db 'CLASS32',0

    Message           MSG <?>

    wc         WNDCLASS  <?>

        

         hdc                       dd 0 

         hPen           dd 0

         memdc                 dd 0 

         Height_                dd ?

         Width_                dd ?

         rect_           RECT <>

         ps                        PAINTSTRUCT  <?>

        

         messX                  db     'X=3sint+sin5t Y=2*cos3t +sint',0

         mess_len    equ $-messX-1

        

         OffsetX                DD ?

         OffsetY                DD ?

         ScaleX                 DD ?

         ScaleY                 DD ?

         X                         DD 0

         Y                         DD 0

         t                           DD 0

         cons            DD ?

         deg_rad                DD 180

.code

start proc

         invoke  GetModuleHandle,0

    mov     hinst,eax

    mov wc.style,CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS

    mov wc.lpfnWndProc,offset WNDPROC

   

    mov eax,hinst

         mov wc.hInstance,eax

         invoke        LoadIcon,0,IDI_APPLICATION

    mov                 wc.hIcon,eax

   

         invoke        LoadCursor,0,IDC_ARROW

         mov            wc.hCursor,eax

        

         invoke  CreateSolidBrush,RGBW

         mov            wc.hbrBackground,eax

   

    mov                 wc.lpszMenuName,0

    mov                 wc.lpszClassName,offset CLASSNAME

         invoke        RegisterClass, offset wc

         invoke CreateWindowEx,0,

                   offset CLASSNAME,

                   offset TITL,

                  WS_CAPTION+WS_SYSMENU+WS_THICKFRAME+WS_GROUP+WS_TABSTOP,

                   100,100,

                   400,450,

                   0,0,HINST,0

     cmp eax,0

     jz  END_LOOP

        

     mov hwnd,eax

     invoke ShowWindow,hwnd,SW_SHOWNORMAL

         invoke UpdateWindow,hwnd

MSG_LOOP:

         invoke GetMessage,offset Message,0,0,0

        

    cmp eax,0

    je  END_LOOP

   

         invoke TranslateMessage,offset Message

         invoke DispatchMessageA,offset Message

    jmp MSG_LOOP

   

END_LOOP:

         invoke ExitProcess,Message.wParam

        

start endp

WNDPROC  proc hW:DWORD,Mes:DWORD,wParam:DWORD,lParam:DWORD

         cmp Mes, WM_DESTROY

         je  WMDESTROY

             

         cmp Mes, WM_CREATE     

         je  WMCREATE

             

         cmp Mes, WM_PAINT

         je  WMPAINT

             

         cmp Mes,WM_SIZE    

         je  WMSIZE

         jmp DEFWNDPROC

WMSIZE:

         cmp memdc,0

         jne WMCREATE

        

         invoke DeleteDC,memdc

        

WMCREATE:

         invoke GetDC,hW

         mov hdc,eax

        

         invoke CreateCompatibleDC,hdc

         mov memdc,eax

        

         invoke GetWindowRect,hW,offset rect_

        

         mov eax,rect_.bottom

         sub eax,rect_.top

         mov Height_, eax

        

         mov eax, rect_.right

         sub eax, rect_.left

         mov Width_, eax

         invoke CreateCompatibleBitmap,hdc,Width_,Height_

         invoke SelectObject,memdc,eax

        

         invoke CreateSolidBrush,RGBW

         invoke SelectObject,memdc,eax

        

         invoke PatBlt,memdc,0,0,Width_,Height_,PATCOPY

         invoke ReleaseDC,hW,hdc

         invoke CreatePen,PS_SOLID,2,0

         mov hPen,eax

         invoke SelectObject,memdc,hPen

        

         mov eax,Height_

         sub eax,27

         shr eax,1   

         mov OffsetY,eax

        

         mov eax,Width_

         sub eax,10

         shr eax,1

         mov OffsetX,eax

        

         invoke MoveToEx,memdc,0,OffsetY,0

         invoke LineTo,memdc,Width_,OffsetY

         ;;;;;;;;;;;;;;;;;;

         invoke MoveToEx,memdc,OffsetX,0,0

         invoke LineTo,memdc,OffsetX,Height_

        

         invoke CreatePen,PS_SOLID,2,00000000h

         mov hPen,eax

         invoke SelectObject,memdc,hPen

        

         mov            eax,0

         mov            t,eax

         mov            eax, 27

         mov            cons,eax

         fild    Width_

         fisub  cons

         mov            eax, 10

         mov            cons,eax

         fidiv  cons

         fstp   ScaleX

         mov            eax, 27

         mov            cons, eax

         fild    Height_

         fisub  cons

         mov            eax, 10

         mov            cons, eax

         fidiv  cons

         fstp   ScaleY

mov            cons,5

         fild    t

         fldpi

         fmulp

         fidiv  deg_rad

         fild    cons

         fmulp

         fsin                     

                              ;MyX=3sint+sin5t

         fild t

         fldpi

         fmulp

        

         fidiv deg_rad

         fsin

         mov            cons,3

         fild    cons

         fmulp

        

         fadd

         fchs

         fmul  ScaleX

         fiadd OffsetX

         fistp  X

        

         mov cons,3  

         fild    t

         fldpi

         fmulp

         fidiv  deg_rad

         fild    cons

         fmulp

         fcos

         mov cons,2         

fild    cons

fmulp

        

         fild t ;sint OK

         fldpi           ;MyX=2cos3t +sint

         fmulp

         fidiv deg_rad

         fsin

         fadd

        

         fmul  ScaleY

         fiadd OffsetY     

         fistp  Y

invoke MoveToEx,memdc,x,y,0

         mov ecx, 360

L:      push ecx

         mov            cons,5

         fild    t

         fldpi

         fmulp

         fidiv  deg_rad

         fild    cons

         fmulp

         fsin                     

                              ;MyX=3sint+sin5t

         fild t

         fldpi

         fmulp

        

         fidiv deg_rad

         fsin

         mov            cons,3

         fild    cons

         fmulp

        

         fadd

         fchs

         fmul  ScaleX

         fiadd OffsetX

         fistp  X

        

         mov cons,3  

         fild    t

         fldpi

         fmulp

         fidiv  deg_rad

         fild    cons

         fmulp

         fcos

         mov cons,2         

fild    cons

fmulp

        

         fild t ;sint OK

         fldpi           ;MyX=2 *cos3t +sint

         fmulp

         fidiv deg_rad

         fsin

         fadd

        

         fmul  ScaleY

         fiadd OffsetY     

         fistp  Y

        

         inc t

        

         invoke LineTo,memdc,X,Y

         pop ecx

         cmp ecx,0

         je M

         dec ecx

         jmp L

M:

         invoke InvalidateRect,hW,offset rect_,0

         invoke SetBkColor,memdc,RGBW

        

         mov eax, mess_len

         INVOKE TextOutA, memdc, 10, 20,

         offset messX, eax ; вывод текста X=3cost+cos5t Y=log2(e)*cos3t +sint

    MOV EAX, 0

    JMP FINISH

WMPAINT:

         invoke BeginPaint,hW,offset ps

         mov  hdc,eax

        

         invoke BitBlt,hdc,0,0,Width_,Height_,memdc,0,0,SRCCOPY

         invoke EndPaint,hdc,offset ps

        

         mov eax,0

    jmp FINISH

WMDESTROY:

         invoke DeleteDC,hPen

         invoke DeleteDC,memdc

         invoke PostQuitMessage, 0

    mov eax, 0

    jmp FINISH

DEFWNDPROC:

         invoke DefWindowProc,hW,Mes,wParam,lParam     

        

FINISH:

         ret

         WNDPROC endp

        

end START


Процедура WNDProc

Главная функция.

Полученный график полностью совпадает с тем, что получен в программе GraphCalc. Следовательно, моя программа работает верно.


Еще из раздела Информатика, программирование:


 Это интересно
 Реклама
 Поиск рефератов
 
 Афоризм
Любовь в жизни бывает только одна, но ее объект постоянно меняется…
 Гороскоп
Гороскопы
 Счётчики
bigmir)net TOP 100