Главная Рефераты по сексологии Рефераты по информатике программированию Рефераты по биологии Рефераты по экономике Рефераты по москвоведению Рефераты по экологии Краткое содержание произведений Рефераты по физкультуре и спорту Топики по английскому языку Рефераты по математике Рефераты по музыке Остальные рефераты Рефераты по авиации и космонавтике Рефераты по административному праву Рефераты по безопасности жизнедеятельности Рефераты по арбитражному процессу Рефераты по архитектуре Рефераты по астрономии Рефераты по банковскому делу Рефераты по биржевому делу Рефераты по ботанике и сельскому хозяйству Рефераты по бухгалтерскому учету и аудиту Рефераты по валютным отношениям Рефераты по ветеринарии Рефераты для военной кафедры Рефераты по географии Рефераты по геодезии Рефераты по геологии Рефераты по геополитике Рефераты по государству и праву Рефераты по гражданскому праву и процессу Рефераты по делопроизводству Рефераты по кредитованию Рефераты по естествознанию Рефераты по истории техники Рефераты по журналистике Рефераты по зоологии Рефераты по инвестициям Рефераты по информатике Исторические личности Рефераты по кибернетике Рефераты по коммуникации и связи |
Лабораторная работа: График функции по 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. Следовательно, моя программа работает верно. |
|