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

Додати в блог або на сайт

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

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


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