49607 (566597)
Текст из файла
Министерство Образования РФ
Южно-Уральский Государственный Университет
Приборостроительный факультет
Кафедра Автоматики и Управления
Курсовая работа по 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. Следовательно, моя программа работает верно.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.