Практическая работа

Практическая работа на тему График функции по Assembler у

Работа добавлена на сайт bukvasha.net: 2014-07-27

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.9.2024


Министерство Образования РФ
Южно-Уральский Государственный Университет
Приборостроительный факультет
Кафедра Автоматики и Управления
Курсовая работа по 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. Следовательно, моя программа работает верно.

1. Контрольная работа на тему Революционный кризис в России начала XX века
2. Реферат на тему Alcoholism Essay Research Paper Alcoholism Symptoms Causes
3. Реферат на тему The Blue Hotel Essay Research Paper daveandpathotmailcom
4. Реферат на тему Charlemagne By The Sword And The Cross
5. Реферат на тему Hydrogen Essay Research Paper ANALYSISThe Potential Markets
6. Реферат Смысл учения Будды
7. Реферат Сказание
8. Курсовая на тему Организация бухгалтерского учета на малом предприятии
9. Реферат Примас Орлеанский
10. Реферат на тему Civil Rights Timeline Essay Research Paper Timelineof