График функции по Assembler"у
WMSIZE: Дескриптор совместимого окна консоли сравнивается с 0 и если не равен, то переходим на метку WMCREATE. В противном случае удаляем контекст окна. Министерство Образования РФ Южно-Уральский Государственный Университет Приборостроительный факультет Кафедра Автоматики и Управления. Полученный график полностью совпадает с тем, что получен в программе GraphCalc. Следовательно, моя программа… Читать ещё >
График функции по 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,00h
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. Следовательно, моя программа работает верно.