Главная страница
Навигация по странице:

  • Курсовая работа по Assembler ’у. Выполнил: Копылов Е.Е.Группа: ПС-116Проверила: Вставская Е.В.Челябинск 2008 годЗадание.

  • Описание решения задачи.

  • Текст программы.

  • Height_ dd Width_ dd

  • Курсовая работа по Assemblerу. Копылов Е. Е. Группа пс116 Проверила Вставская Е. В. Челябинск 2008 год


    Скачать 2.08 Mb.
    НазваниеКурсовая работа по Assemblerу. Копылов Е. Е. Группа пс116 Проверила Вставская Е. В. Челябинск 2008 год
    Дата14.03.2022
    Размер2.08 Mb.
    Формат файлаrtf
    Имя файлаStudentBank.ru_8683.rtf
    ТипКурсовая
    #395445

    Министерство Образования РФ

    Южно-Уральский Государственный Университет

    Приборостроительный факультет

    Кафедра Автоматики и Управления

    Курсовая работа по 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. Следовательно, моя программа работает верно.


    написать администратору сайта