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

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

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

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

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

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

от 25%

Подписываем

договор

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

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


Министерство Образования РФ
Южно-Уральский Государственный Университет
Приборостроительный факультет
Кафедра Автоматики и Управления
Курсовая работа по 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. Курсовая Рынок канцелярских и школьно-письменных товаров
2. Реферат на тему Что же сбылось из предсказаний Нострадамуса
3. Реферат Совершенствование эффективности переработки леса в России и за рубежом
4. Сочинение на тему Сочинения на свободную тему - Как мы работали в саду3
5. Реферат на тему World War 1
6. Реферат на тему Socrates Essay Research Paper An Apology From
7. Диплом Понятие и цели наказания в российском уголовном праве теоретические аспекты
8. Реферат Безработица как соцально-экономическое явление
9. Сочинение на тему Литературный герой ПАТРОКЛ
10. Реферат Финансы акционерного общества 3