Министерство Образования РФ
Южно-Уральский Государственный Университет
Приборостроительный факультет
Кафедра Автоматики и Управления
Курсовая работа по 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. Следовательно, моя программа работает верно.
Похожие работы
й системы счисления в другую (2,8,10,16). Восходящее проектирование – используется для несложных задач, когда заранее известны все подзадачи или функции, которые выполнять программа. Разрабатывается алгоритм для каждой подзадачи, а затем они собираются в единую подпрограмму. 7. Нисходящее программирование. Проектирование алгоритма выполнения арифметических операций (+,-,*,/) над числами с пл. ...
... gettextsettings(), settextstyle(), setusercharsize(). viewporttype – Используется для получения настроек области вывода функцией getviewsettings(). struct viewporttype { int left; int top; int right; int bottom; int clip; } 2. Реализация пользовательской библиотеки “mouse.h” В стандартной комплектации BorlandC2.0, BorlandC3.1 или любой версии компилятора C++ от любой другой ...
ть специализированный математический процессор для вычисления элементарных функций arcSin(Z) и arCth(Z). Эти функции можно реализовать методом Волдера «Цифра за цифрой», метод Меджита и др. Оба эти метода основаны на ряде итерационных формул, которые приведены в таблице 1.1. Основное их различие заключается в том, что в методе Меджита на первом этапе сразу рассчитываются все направляющие ...
... программе. В данном разделе они перечислены в алфавитном порядке и приводятся с объяснениями. Эти ошибки могут являться следствием случайного затирание памяти программой. Abnormal program termination Аварийное завершение программы Данное сообщение может появляться, если для выполнения программы не может быть выделено достаточного количества памяти. Более подробно оно рассматривается в конце ...
0 комментариев