Министерство Образования РФ
Южно-Уральский Государственный Университет
Приборостроительный факультет
Кафедра Автоматики и Управления
Курсовая работа по 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
.modelflat,stdcall
RGBW equ 00D4D0C8h ; цвет фонавокне
includewin.inc
.data
hwnd dd 0
hinst dd 0
TITL db«Курсовой_Копылов_ПС-116»,0
CLASSNAME db 'CLASS32',0
Message MSG
wc WNDCLASS
hdc dd0
hPen dd0
memdc dd0
Height_ dd?
Width_ dd?
rect_ RECT
ps PAINTSTRUCT
messX db 'X=3sint+sin5tY=2*cos3t +sint',0
mess_len equ $-messX-1
OffsetX DD?
OffsetY DD?
ScaleX DD?
ScaleY DD?
X DD0
Y DD0
t DD0
cons DD?
deg_rad DD180
.code
startproc
invoke GetModuleHandle,0
mov hinst,eax
mov wc.style,CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
mov wc.lpfnWndProc,offset WNDPROC
mov eax,hinst
movwc.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
invokeCreateWindowEx,0,
offsetCLASSNAME,
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
invokeUpdateWindow,hwnd
MSG_LOOP:
invokeGetMessage,offset Message,0,0,0
cmp eax,0
je END_LOOP
invokeTranslateMessage,offset Message
invokeDispatchMessageA,offset Message
jmp MSG_LOOP
END_LOOP:
invokeExitProcess,Message.wParam
startendp
WNDPROC proc hW:DWORD,Mes:DWORD,wParam:DWORD,lParam:DWORD
cmpMes, WM_DESTROY
je WMDESTROY
cmpMes, WM_CREATE
je WMCREATE
cmpMes, WM_PAINT
je WMPAINT
cmpMes,WM_SIZE
je WMSIZE
jmpDEFWNDPROC
WMSIZE:
cmpmemdc,0
jneWMCREATE
invokeDeleteDC,memdc
WMCREATE:
invokeGetDC,hW
movhdc,eax
invokeCreateCompatibleDC,hdc
movmemdc,eax
invokeGetWindowRect,hW,offset rect_
moveax,rect_.bottom
subeax,rect_.top
movHeight_, eax
moveax, rect_.right
subeax, rect_.left
movWidth_, eax
invokeCreateCompatibleBitmap,hdc,Width_,Height_
invokeSelectObject,memdc,eax
invokeCreateSolidBrush,RGBW
invokeSelectObject,memdc,eax
invokePatBlt,memdc,0,0,Width_,Height_,PATCOPY
invokeReleaseDC,hW,hdc
invokeCreatePen,PS_SOLID,2,0
movhPen,eax
invokeSelectObject,memdc,hPen
moveax,Height_
subeax,27
shreax,1
movOffsetY,eax
moveax,Width_
subeax,10
shreax,1
movOffsetX,eax
invokeMoveToEx,memdc,0,OffsetY,0
invokeLineTo,memdc,Width_,OffsetY
;;;;;;;;;;;;;;;;;;
invokeMoveToEx,memdc,OffsetX,0,0
invokeLineTo,memdc,OffsetX,Height_
invokeCreatePen,PS_SOLID,2,00000000h
movhPen,eax
invokeSelectObject,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
fildt
fldpi
fmulp
fidivdeg_rad
fsin
mov cons,3
fild cons
fmulp
fadd
fchs
fmul ScaleX
fiadd OffsetX
fistp X
movcons,3
fild t
fldpi
fmulp
fidiv deg_rad
fild cons
fmulp
fcos
movcons,2
fild cons
fmulp
fildt ;sint OK
fldpi ;MyX=2cos3t +sint
fmulp
fidivdeg_rad
fsin
fadd
fmul ScaleY
fiadd OffsetY
fistp Y
invokeMoveToEx,memdc,x,y,0
movecx, 360
L: pushecx
mov cons,5
fild t
fldpi
fmulp
fidiv deg_rad
fild cons
fmulp
fsin
;MyX=3sint+sin5t
fildt
fldpi
fmulp
fidivdeg_rad
fsin
mov cons,3
fild cons
fmulp
fadd
fchs
fmul ScaleX
fiadd OffsetX
fistp X
movcons,3
fild t
fldpi
fmulp
fidiv deg_rad
fild cons
fmulp
fcos
movcons,2
fild cons
fmulp
fildt ;sint OK
fldpi ;MyX=2 *cos3t +sint
fmulp
fidivdeg_rad
fsin
fadd
fmul ScaleY
fiadd OffsetY
fistp Y
inct
invokeLineTo,memdc,X,Y
popecx
cmpecx,0
jeM
dececx
jmpL
M:
invokeInvalidateRect,hW,offset rect_,0
invokeSetBkColor,memdc,RGBW
moveax, mess_len
INVOKETextOutA, memdc, 10, 20,
offsetmessX, eax; вывод текстаX=3cost+cos5t Y=log2(e)*cos3t +sint
MOVEAX, 0
JMP FINISH
WMPAINT:
invokeBeginPaint,hW,offset ps
mov hdc,eax
invokeBitBlt,hdc,0,0,Width_,Height_,memdc,0,0,SRCCOPY
invokeEndPaint,hdc,offset ps
moveax,0
jmp FINISH
WMDESTROY:
invokeDeleteDC,hPen
invokeDeleteDC,memdc
invokePostQuitMessage, 0
mov eax, 0
jmp FINISH
DEFWNDPROC:
invokeDefWindowProc,hW,Mes,wParam,lParam
FINISH:
ret
WNDPROCendp
endSTART
ПроцедураWNDProc
/>
Главнаяфункция.
/>
Полученныйграфик полностью совпадает с тем, что получен в программе GraphCalc.Следовательно, моя программа работает верно.