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