49607 (График функции по Assembler’у)

2016-07-28СтудИзба

Описание файла

Документ из архива "График функции по Assembler’у", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "49607"

Текст из документа "49607"

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

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

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

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

Курсовая работа по 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. Следовательно, моя программа работает верно.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
436
Средний доход
с одного платного файла
Обучение Подробнее