реферат
Главная

Рефераты по сексологии

Рефераты по информатике программированию

Рефераты по биологии

Рефераты по экономике

Рефераты по москвоведению

Рефераты по экологии

Краткое содержание произведений

Рефераты по физкультуре и спорту

Топики по английскому языку

Рефераты по математике

Рефераты по музыке

Остальные рефераты

Рефераты по авиации и космонавтике

Рефераты по административному праву

Рефераты по безопасности жизнедеятельности

Рефераты по арбитражному процессу

Рефераты по архитектуре

Рефераты по астрономии

Рефераты по банковскому делу

Рефераты по биржевому делу

Рефераты по ботанике и сельскому хозяйству

Рефераты по бухгалтерскому учету и аудиту

Рефераты по валютным отношениям

Рефераты по ветеринарии

Рефераты для военной кафедры

Рефераты по географии

Рефераты по геодезии

Рефераты по геологии

Рефераты по геополитике

Рефераты по государству и праву

Рефераты по гражданскому праву и процессу

Рефераты по делопроизводству

Рефераты по кредитованию

Рефераты по естествознанию

Рефераты по истории техники

Рефераты по журналистике

Рефераты по зоологии

Рефераты по инвестициям

Рефераты по информатике

Исторические личности

Рефераты по кибернетике

Рефераты по коммуникации и связи

Лабораторная работа: График функции по Assembler’у

Лабораторная работа: График функции по 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. Следовательно, моя программа работает верно.





© 2010 Интернет База Рефератов