Материал: 11

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Федеральное агентство связи

Федеральное государственное бюджетное образовательное

учреждение высшего образования

Поволжский государственный университет

телекоммуникаций и информатики

Кафедра Информационных систем и технологий

Лабораторная работа №11

По дисциплине «Архитектура информационной системы»

Тема: «Программирование математического сопроцессора»

Вариант 11 и 5

Выполнили: студенты группы ИСТ-74У

Гусева Полина и Смолева Вера

Руководитель :

__________________ Куляс О.Л.

Самара 2018

Цель работы Изучение принципов работы сопроцессора и методов его программирования средствами Ассемблера. Изучение графического режима вывода на экран и методов его программирования. Знакомство с макросредствами Ассемблера.

4.1 Используя, описанный в разделе 2, алгоритм расчета и вывода на экран спирали разобрать исходный текст программы SPIRAL. Создать и отладить исполняемый модуль программы SPIRAL.EXE, выполнив этапы ассемблирования и компоновки. Добавить в исходный модуль программы недостающие комментарии

TITLE SPIRAL ;Программа построения спирали Архимеда

include z1.inc ;подключить макросы вывода точки, осей и символа

.model small

.stack 100h

.data

fi dd 0.0 ;Начальное значение переменной угла.

delta dd 0.001 ;Шаг изменения угла.

xdiv2 dw 320 ;Координаты центра экрана по X.

ydiv2 dw 240 ;Координаты центра экрана по Y.

K dd 5.0 ;Коэффициент шага спирали.

xr dw 0 ;Координата выводимой точки по X.

yr dw 0 ;Координата [[7выводимой точки по Y.

forcolor DB 0Ah ;Цвет спирали (салатовый).

Variant db 'Spiral_XX_3_vitka', '$' ;Поясняющая надпись.

.code

.486 ;Используем расширенную систему команд

;---------------Вывод пиксела--------------------------------

;CX-координата X (столбец), DX-координата Y (строка),

;AL-цвет пиксела

POINT PROC

pusha

mov CX,xr ;Вычисляем координату х

add CX, xdiv2 ;в регистре CX.

mov DX, ydiv2 ;Вычисляем координату y

sub DX, yr ;в регистре DX.

mov AL, forcolor ;Задать цвет спирали.

mov BH, 0

mov AH,12 ;Вывести пиксел

int 10h ;средствами BIOS.

popa

ret

POINT ENDP

;-----------Закрашивание экрана цветом фона---------

;CX-координата X (столбец), DX-координата Y (строка),

;AL-цвет пиксела

FON PROC

pusha

mov CX, 0 ;Вычисляем координату х

mov DX, 0 ;Вычисляем координату y

mov AL, 05h ;Цвет фона.

mov BH, 0 ;Номер страницы.

c_1: mov AH, 12 ;Вывести пиксел

Int 10h ;средствами bios.

inc CX

cmp CX, 639

jne c_1

xor CX, CX

inc DX

cmp DX, 479

jne c_1

popa

ret

FON ENDP

;===========Основная программа====================

start: mov ax,@DATA ;Инициализация

mov ds,ax ;регистра DS.

xor ax,ax

mov CX, 18840 ;Количество итераций цикла

;(определяет число витков).

;------------------------------------------------------

mov ah,0h ;Инициализация графического

mov al,12h ;режима 640х480.

int 10h

call FON ;Вызов процедуры закрашивания фона.

;-------Вывод строки Variant----------------------------

pusha

mov cx,17 ;Вычисляем координату х

mov bx,0

l3: mov al,Variant[bx]

inc bx

OutCharG bl, 02h, 03h, al ;Вызов макроса.

loop l3

popa

;---------рисуем оси-----------------------------------

AxleX ;Вызов макроса.

AxleY ;Вызов макроса.

;------Вычисляем формулу x=round(fi*K*cos(fi))---------

finit ;Инициализация сопроцессора.

l1: fld fi ;Загрузить угол fi в стек FPU.

fcos ;Вычислить cos(fi).

fld fi ;Загрузить угол fi в стек FPU.

fmul K ;ST(0):=K*(ST(0))

fmul ;ST()):=(ST(0))*(ST(1))

frndint ;ST(0):=round(ST(0))

fistp word ptr xr ;Заносим X в переменную для вывода

;на экран

;------Вычисляем формулу y=round(fi*K*sin(fi))-----------

fld fi

fsin

fld fi

fmul K

fmul

frndint

fistp word ptr yr ;Заносим Y в переменную для вывода

;на экран.

call POINT

;---------Вычисляем новое значение угла fi------------------- fld delta

fld fi

fadd

fstp fi

loop l1 ;Повторить цикл пока (СХ) не равно 0.

;--------------------------------------------------------------

mov ah,1h ;Ожидание нажатия клавиши.

int 21h

;-----------------------------------------------------------------

mov ah,0h ;Перевод в Text Mode.

mov al,03h

int 10h

;-----------------------------------------------------------------

exit: mov ax,4C00h ;Стандартный выход.

int 21h

END start

4.2 Программа использует для вывода символов и построения осей системы координат макросы, которые располагаются в отдельном файле с именем pixels.inc текст которого приводится ниже. Этот текстовый файл требуется создать и сохранить в вашем рабочем каталоге.

;Исходный текст файла макросов pixels.inc

;-----------------------------------------

;Макрос вывода символа в графическом режиме

;(char - ASCII код символа)

OutCharG macro x, y, color, char

pusha

mov ah, 02h ;установка позиции курсора

mov bh, 0h ;номер страницы видеопамяти (для графики 0)

mov dh, y ;номер строки

mov dl, x ;номер столбца

int 10h ;выполняется прерывание

mov ah, 09h ;выводится символ

mov al, char ;выводимый символ

mov bh, 0h ;номер активной страницы

mov bl, color ;цвет

mov cx, 01h ;число выводимых символов

int 10h ;прерывание

popa

endm

;--------------------------------------------

;Макрос вывода пиксела на экран с коорд. x,y и цветом color

PutPixel macro x,y,color

pusha

mov ah, 0ch

mov al, color

mov bh, 0h

mov cx, x

mov dx, y

int 10h

popa

endm

;----------------------------------------

;Макрос вывода горизонтальной линии в середине экрана

AxleX macro

local iter

pusha

OutCharG 4eh, 0fh, 03h, 78h ;X ;(первое число - двигаем по Х, 2 - по Y, 3 - выводит цвет текст, 4 -кол-во выврдимых пиксел.

mov cx, 640 ;количестов точек

iter:

PutPixel cx,240,4h

loop iter

PutPixel 637,241,4h ;стрелка

PutPixel 637,239,4h

PutPixel 636,241,4h

PutPixel 636,239,4h

PutPixel 635,241,4h

PutPixel 635,239,4h

PutPixel 634,241,4h

PutPixel 634,239,4h

PutPixel 633,241,4h

PutPixel 633,239,4h

PutPixel 632,242,4h

PutPixel 632,238,4h

PutPixel 633,242,4h

PutPixel 633,238,4h

PutPixel 632,241,4h

PutPixel 632,239,4h

PutPixel 634,242,4h

PutPixel 634,238,4h

popa

endm

;---------------------------------------------------------

;Макрос вывода вертикальной линии в середине экрана

AxleY macro

local iters

pusha

mov cx, 480

iters:

mov dx,cx

PutPixel 320,dx,4h

dec cx

cmp cx,19

jge iters

PutPixel 319,22,4h ;Стрелка. PutPixel 321,22,4h

PutPixel 319,23,4h

PutPixel 321,23,4h

PutPixel 319,24,4h

PutPixel 321,24,4h

PutPixel 318,25,4h

PutPixel 322,25,4h

PutPixel 318,26,4h

PutPixel 322,26,4h

PutPixel 318,27,4h

PutPixel 322,27,4h

PutPixel 319,26,4h

PutPixel 321,26,4h

PutPixel 319,27,4h

PutPixel 321,27,4h

PutPixel 319,25,4h

PutPixel 321,25,4h

OutCharG 29h,01h,03h,79h ;Y

popa

endm

4.3 Отредактировать исходный модуль программы SPIRAL для своего варианта задания (таблица 11.1).

4.4 Создать и отладить исполняемый модуль программы SPIRALXX.EXE (XX – номер варианта), выполнив этапы ассемблирования и компоновки.

11 вариант

TITLE SPIRAL ;Программа построения спирали Архимеда

include 11.inc ;подключить макросы вывода точки, осей и символа

.model small

.stack 100h

.data

fi dd 0.0 ;Начальное значение переменной угла.

delta dd 0.001333 ;Шаг изменения угла.

xdiv2 dw 160 ;Координаты центра экрана по X.

ydiv2 dw 100 ;Координаты центра экрана по Y.

K dd 3.0 ;Коэффициент шага спирали.

Xr dw 0 ;Координата выводимой точки по X.

yr dw 0 ;Координата [[7выводимой точки по Y.

forcolor DB 07h ;Цвет спирали (салатовый).

Variant db 'Spiral_XX_3_vitka', '$' ;Поясняющая надпись.

.code

.486 ;Используем расширенную систему команд

;---------------Вывод пиксела--------------------------------

;CX-координата X (столбец), DX-координата Y (строка),

;AL-цвет пиксела

POINT PROC

pusha

mov CX,xr ;Вычисляем координату х

add CX, xdiv2 ;в регистре CX.

mov DX, ydiv2 ;Вычисляем координату y

sub DX, yr ;в регистре DX.

mov AL, forcolor ;Задать цвет спирали.

mov BH, 0

mov AH,12 ;Вывести пиксел

Int 10h ;средствами bios.

popa

ret

POINT ENDP

;-----------Закрашивание экрана цветом фона---------------------

;CX-координата X (столбец), DX-координата Y (строка),

;AL-цвет пиксела

FON PROC

pusha

mov CX, 0 ;Вычисляем координату х

mov DX, 0 ;Вычисляем координату y

mov AL, 09h ;Цвет фона.

mov BH, 0 ;Номер страницы.

c_1: mov AH, 12 ;Вывести пиксел

Int 10h ;средствами bios.

inc CX

cmp CX, 319

jne c_1

xor CX, CX

inc DX

cmp DX, 199

jne c_1

popa

ret

FON ENDP

;===========Основная программа====================

start: mov ax,@DATA ;Инициализация

mov ds,ax ;регистра DS.

xor ax,ax

mov CX, 18840 ;Количество итераций цикла

;(определяет число витков).

;------------------------------------------------------

mov ah,0h ;Инициализация графического

mov al,0Dh ;режима 640х480.

int 10h

call FON ;Вызов процедуры закрашивания фона.

;-------Вывод строки Variant----------------------------

pusha

mov cx,17 ;Вычисляем координату х

mov bx,0

l3: mov al,Variant[bx]

inc bx

OutCharG bl, 02h, 0E7h, al ;Вызов макроса.

loop l3

popa

;---------рисуем оси-----------------------------------

AxleX ;Вызов макроса.

AxleY ;Вызов макроса.

;------Вычисляем формулу x=round(fi*K*cos(fi))----------

finit ;Инициализация сопроцессора.

l1: fld fi ;Загрузить угол fi в стек FPU.

fcos ;Вычислить cos(fi).

fld fi ;Загрузить угол fi в стек FPU.

fmul K ;ST(0):=K*(ST(0))

fmul ;ST()):=(ST(0))*(ST(1))

frndint ;ST(0):=round(ST(0))

fistp word ptr xr ;Заносим X в переменную для вывода

;на экран

;------Вычисляем формулу y=round(fi*K*sin(fi))-----------

fld fi

fsin

fld fi

fmul K

fmul

frndint

fistp word ptr yr ;Заносим Y в переменную для вывода

;на экран.

call POINT

;---------Вычисляем новое значение угла fi-------------

fld delta

fld fi

fadd

fstp fi

loop l1 ;Повторить цикл пока (СХ) не равно 0.

;------------------------

mov ah,1h ;Ожидание нажатия клавиши.

int 21h

;---------------------------

mov ah,0h ;Перевод в Text Mode.

mov al,03h

int 10h

;--------------------------

exit: mov ax,4C00h ;Стандартный выход.

int 21h

END start

11.inc

;Исходный текст файла макросов pixels.inc

;------------------------------------------

;Макрос вывода символа в графическом режиме

;(char - ASCII код символа)

OutCharG macro x, y, color, char

pusha

mov ah, 02h ;установка позиции курсора

mov bh, 0h ;номер страницы видеопамяти (для графики 0)

mov dh, y ;номер строки

mov dl, x ;номер столбца

int 10h ;выполняется прерывание

mov ah, 09h ;выводится символ

mov al, char ;выводимый символ

mov bh, 0h ;номер активной страницы

mov bl, color ;цвет

mov cx, 01h ;число выводимых символов

int 10h ;прерывание

popa

endm

;------------------------------------------

;Макрос вывода пиксела на экран с коорд. x,y и цветом color

PutPixel macro x,y,color

pusha

mov ah, 0ch

mov al, color

mov bh, 0h

mov cx, x

mov dx, y

int 10h

popa

endm ;---------------------------------------------

;Макрос вывода горизонтальной линии в середине экрана

AxleX macro

local iter

pusha

OutCharG 198, 0Dh, 0E7h, 78h ;X ;(первое число - двигаем по Х, 2 - по Y, 3 - выводит цвет текст, 4 -кол-во выврдимых пиксел.

mov cx, 319 ;количестов точек

iter:

PutPixel cx, 100, 0Eh ;двигаем ось

loop iter

PutPixel 318, 99, 0Eh ;стрелка

PutPixel 317, 99, 0Eh

PutPixel 316, 98, 0Eh

PutPixel 315, 98, 0Eh

PutPixel 314, 97, 0Eh

PutPixel 313, 97, 0Eh

PutPixel 312, 96, 0Eh

PutPixel 311, 96, 0Eh

PutPixel 310, 95, 0Eh ;9

PutPixel 318, 101, 0Eh

PutPixel 317, 101, 0Eh

PutPixel 316, 102, 0Eh

PutPixel 315, 102, 0Eh

PutPixel 314, 103, 0Eh

PutPixel 313, 103, 0Eh

PutPixel 312, 104, 0Eh

PutPixel 311, 104, 0Eh

PutPixel 310, 105, 0Eh ;18

popa

endm ;---------------------------------------------------------

;Макрос вывода вертикальной линии в середине экрана

AxleY macro

local iters

pusha

mov cx, 200

iters:

mov dx,cx

PutPixel 160, dx, 0Eh ;двигаем ось

dec cx

cmp cx, 3

jge iters

PutPixel 160, 1, 0Eh ;Стрелка.

PutPixel 159, 2, 0Eh

PutPixel 159, 3, 0Eh

PutPixel 158, 4, 0Eh

PutPixel 158, 5, 0Eh

PutPixel 157, 6, 0Eh

PutPixel 157, 7, 0Eh

PutPixel 156, 8, 0Eh

PutPixel 156, 9, 0Eh ;9

PutPixel 160, 1, 0Eh

PutPixel 161, 2, 0Eh

PutPixel 161, 3, 0Eh

PutPixel 162, 4, 0Eh

PutPixel 162, 5, 0Eh

PutPixel 163, 6, 0Eh

PutPixel 163, 7, 0Eh

PutPixel 164, 8, 0Eh

PutPixel 164, 9, 0Eh ;18

OutCharG 89h, 00h, 0E7h, 79h ;Y

popa

endm

Алгоритм выполняемой лабораторной работы Архимедова спираль – плоская кривая, траектория точки M (рис. 11.1), которая равномерно движется вдоль луча OV с началом в O, в то время как сам луч OV равномерно вращается вокруг O. Другими словами, расстояние ρ = OM пропорционально углу поворота ϕ луча OV. Повороту луча OV на один и тот же угол соответствует одно и то же приращение ρ.

Уравнение Архимедовой спирали в полярной системе координат записывается как ρ ϕ = k , где k – смещение точки M по лучу, при его повороте на угол ϕ равный одному радиану. Повороту прямой на 2π соответствует смещение a = |BM| = |MA| = 2kπ . Число a называется шагом спирали. Уравнение Архимедовой спирали можно переписать так:

При ϕ = 0 значение ρ = 0 и точка спирали М находится в центре О, приϕ π = 2 , точка спирали М находится в точке С на расстоянии а от центра. Далее по мере увеличения угла ϕ она будет удаляться от центра на величину шага а с каждым витком. При вращении луча против часовой стрелки получается правая спираль (см. рис. 11.2), при вращении по часовой стрелке – левая спираль.

Обе ветви спирали (правая и левая) описываются одним уравнением (11.1). Положительным значениям соответствует правая спираль, отрицательным — левая спираль. Если точка M будет двигаться по прямой UV из отрицательных значений через центр вращения O и далее в положительные значения, вдоль прямой UV, то точка M опишет обе ветви спирали.