Графік функції з 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,00000000 h
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. Отже, моя програма працює правильно.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Практична робота
16кб. | скачати


Схожі роботи:
Графік функції з Assemblerу
Assembler 2
Конкатенація строк Assembler
Графік
Створення програми з використанням програмного продукту Turbo Assembler
Великий графік Добужинський МВ
Шагал Марк живописець і графік
Місячний графік роботи групи суден
Теодор Жеріко 1791-1824 французький живописець і графік
© Усі права захищені
написати до нас