Главная страница

Лабор-3. Лабораторная работа 3 по дисциплине Эксплуатация и развитие компьютерных сетей и систем Программирование математического сопроцессора 80х87


Скачать 52 Kb.
НазваниеЛабораторная работа 3 по дисциплине Эксплуатация и развитие компьютерных сетей и систем Программирование математического сопроцессора 80х87
Дата23.10.2022
Размер52 Kb.
Формат файлаdoc
Имя файлаЛабор-3.doc
ТипЛабораторная работа
#749510


Министерство образования и науки Российской Федерации
Факультет дистанционного обучения (ФДО)
Томский государственный университет систем

управления и радиоэлектроники

(ТУСУР)


Кафедра промышленной электроники (ПрЭ)


Лабораторная работа №3
по дисциплине

«Эксплуатация и развитие компьютерных сетей и систем»
Программирование математического сопроцессора 80х87

Вариант-5

Выполнил:

Студент ФДО

Группы з-367-а

Несонов Э.В.

Специальность: 210106
« 30» апреля 2012г.
Проверил:
________________

« ___ » ____________2012г.


2012

ВВЕДЕНИЕ

Цель работы: Программирование математического сопроцессора 80х87.
ЗАДАНИЕ

Написать и отладить фрагмент программы на встроенном ассемблере, эквивалентный указанному на языке Pascal (переменные f, x, y, z определены в основной программе, тип - Double). Исходные значения x, y и z подобрать так, чтобы в программе не требовалась нормализация аргументов команд сопроцессора.

Вариант индивидуального задания:

f:=exp(x+ln(x+cos(y/z)))+exp(x+tg(y*ln(x+z)))
ВЫПОЛНЕНИЕ РАБОТЫ

Для выполнения работы, исходя из условия задания, зададимся значениями переменных x, y и z таким образом, чтобы в исходной функции не было таких исключений, как деление на ноль.

Зададимся значениями: x = 0.2, y = 0.25, z = 0.24

Реализуем заданную в задании функцию на языке высокого уровня (Turbo Pascal) и на языке assembler, используя команды математического сопроцессора. Для наглядности поместим обе реализации функции в одну программу.

Так же, поскольку в языке Turbo Pascal нет встроенной функции вычисления тангенса, заменим тангенс на отношение синуса к косинусу:

tg(y*ln(x+z)) = sin(y*ln(x+z))/cos(y*ln(x+z))

Листинг программы представлен в приложении А.

После написания исходного кода запустим программу на исполнение и убедимся в правильности расчетов, производимых программой.



Рисунок 1 – Результат выполнения программы.
Как видно из рис.1, выполнение расчета функции f на языке ассемблера и Turbo Pascal совпадает, что говорит о правильной реализации программного кода на языке assembler с использованием команд математического сопроцессора.

ЗАКЛЮЧЕНИЕ
В ходе проделанной работы были изучены команды математического сопроцессора и изучена работа команд математического сопроцессора в программной среде Turbo Pascal. Так же в ходе работы было выполнено индивидуальное задание по расчету заданной функции на языке высокого уровня (Turbo Pascal) и на языке низкого ровня (Assembler) с использованием команд математического сопроцессора.
ПРИЛОЖЕНИЕ А
Листинг 1 – Реализация программы.
Program FPU_ASSEMBLER;

uses crt;

var result,r,f:double;

Const x:double = 0.2;

y:double = 0.25;

z:double = 0.24;

Begin

clrscr;

{ Поскольку в Turbo pascal нет функции tg, заменим его на отношение

tg = sin/cos и найдем значение функции f}

f:=exp(ln(x+cos(y+z))+x)+exp(x+(sin(y*ln(x+z))/cos(y*ln(x+z))));

asm

fld y; {загрузка значения переменной y в верхушку стека}

fld z; {загрузка значения переменной z в верхушку стека}

fdiv; {находим y/z}

fptan; {находим тангенс выражения, при этом:}

{st1--> x1 st0-->y1 cos(y/z)=(sqrt(y1^2/(x1^2+y1^2)))}

fmul st(0),st(0); {возводим в квадрат y1}

fxch st(1); {перестановка содержимого верхушки стека и st(1)}

fmul st(0),st(0); {возводим в квадрат x1}

fadd st(0),st(1); {складываем x1^2+y1^2}

fdiv st(1),st(0); {находим y1^2/(x1^2+y1^2)}

fxch st(1); {меняем местами делитель и делимое}

fsqrt; {корень квадратный из результата, содержащегося в верхушке стека}

fld x; {загрузка значения переменной x в верхушку стека}

fadd; {находим cos(y/z) + x}
fld1; {находим ln(cos(y+z) + x)}

fxch st(1);

fyl2x;

fldl2e;

fdiv;

fld x

fadd; {находим Ln (cos(y+z)+x) + x}

{находим exp (Ln(cos(y+z)+x)+x)}

fldl2e; {логарифм e по основанию 2}

fmul;

f2xm1; {2 в степени (cos(y/z)+x)*log e по основанию 2 без 1}

fld1;

fadd;
fstp r; {очистим верхушку стека и запомним промежеточный результат в переменную r}
fld x; {снова зашружаем переменные в верхушку стека}

fld z;

fadd; {находим x+z}
fld1; {находим ln(x+z)}

fxch st(1); {перестановка содержимого верхушки стека и st(1)}

fyl2x; {логарифм результата по основанию 2}

fldl2e; {загрузка в стек логарифма е по основанию 2}

fdiv;
fld y; {y*ln(x+z)}

fmul;
fptan; {tg(y*Ln(x+z))}

fdiv;

fld x;

fadd; {tg(y*Ln(x+z))+x}
fldl2e; {exp(tg(y*Ln(x+z))+x)}

fmul;

f2xm1;

fld1;

fadd;

fst result; {второе промежуточное слагаемое запоминаем в переменную result}

fld r; {загруаем первое промежуточное слагаемое}

fadd; {складываем со вторым}

fstp result; {общий результат в переменную Result}

end;

writeln('Resultat Assembler: ',result:3:3); {вывод результата на ассемблере}

writeln('Resultat Turbo Pascal: ',f:3:3); {вывод результата на паскале}

readln;

end.


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