Контрольная работа по предмету "Информатика, программирование"


График функции по 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 в стек. Помещаем в cons5. Загружаем последовательно в стек 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. Помещаем в eaxmess_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. Следовательно, моя программа работает верно.



Не сдавайте скачаную работу преподавателю!
Данную контрольную работу Вы можете использовать для выполнения своих заданий.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :