Лабор-3. Лабораторная работа 3 по дисциплине Эксплуатация и развитие компьютерных сетей и систем Программирование математического сопроцессора 80х87
Скачать 52 Kb.
|
Министерство образования и науки Российской Федерации Факультет дистанционного обучения (ФДО) Томский государственный университет систем управления и радиоэлектроники (ТУСУР) Кафедра промышленной электроники (ПрЭ) Лабораторная работа №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. |