Лабораторная работа №81 / lab8 EVM
.docСанкт-Петербургский государственный электротехнический университет
Отчёт по лабораторной работе №8
по дисциплине «Организация и функционирование ЭВМ»
Вариант №6
Проверил:
Выполнил: Юбрин А.Н.
Шин Е.Д.
Санкт-Петербург
2002
Постановка задачи
Разработать подпрограмму на языке Ассемблера, обеспечивающую вычисление заданной математической функции с использованием математического сопроцессора. Подпрограмма должна вызываться из головной программы, разработанной на языке С. При этом должны быть обеспечены заданный способ вызова и обмен параметрами.
Выполнить трансляцию программы с подготовкой ее ассемблерной версии и отладочной информации. Для выбранного контрольного набора исходных данных прогнать программу под управлением
отладчика td. При этом для каждой команды сопроцессора следует фиксировать содержимое используемых ячеек памяти, регистров ЦП и численных регистров сопроцессора до и после выполнения этой команды.
Проверить корректность выполнения вычислений для нескольких наборов исходных данных.
Требуется вычислить значение функции xe
-
Цель работы
Научиться использовать команды сопроцессора, а так же научиться использовать ассемблер для написания подпрограмм используемых в языках высокого уровня таких например как C.
При выполнении вычисления функции, сначала в стек сопроцессора заносится значение x, затем значение константы 2e, после этого выполняется умножение с выталкиванием fmulp
Содержимое регистров сопроцессора после выполнения каждой команды показано на листинге 1.
Компиляция осуществляется с помощью строки вида: tcc -f87 lab8c lab8.asm,
где tcc - Turbo C Version 2.01 Copyright (c) 1987, 1988 Borland International
-f87 - 8087 floating point,
-
Проверка работоспособности программы
X=3, то 32e=19.74 Истинное значение 19.742658
X=1, то 2e= 6.58 Истинное значение 6.580886
X=1/2e, то ldexp=1 Истинное значение 1
Листинг 1
fld [x]
Valid ST(0) 3
Empty ST(1)
Empty ST(2)
Empty ST(3)
Empty ST(4)
Empty ST(5)
Empty ST(6)
Empty ST(7)
Fld exp2
Valid ST(0) 6.580886
Valid ST(1) 3
Empty ST(2)
Empty ST(3)
Empty ST(4)
Empty ST(5)
Empty ST(6)
Empty ST(7)
fmulp
Valid ST(0) 19.742658
Empty ST(1)
Empty ST(2)
Empty ST(3)
Empty ST(4)
Empty ST(5)
Empty ST(6)
Empty ST(7)
Текст программа на C
#include <stdio.h>
extern double ldexp(double);
void main()
{
float i;
printf("*** Вычисление значения x*2^exp ***\n");
printf("Введите значение x:");
scanf("%f",&i);
printf("%f*2^exp=%f",i,ldexp(i));
}
Текст программы на assembler
dosseg
.model small
.data
Exp2 dq 6.580885988
.code
public _ldexp
_ldexp proc
.386
arg x:qword
push BP
mov BP, SP
fld [x] ; ST = x
fld Exp2 ; ST (1) = x ST=2^exp
fmulp ; ST =x*2^exp
pop BP
ret
_ldexp endp
end
5. Вывод: В результате проведенной лабораторной работы, мы освоили работу с сопроцессором.