Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Примеры отчетов / ASM. Лаб. 5

.docx
Скачиваний:
58
Добавлен:
01.10.2019
Размер:
28.98 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"

Факультет инфокоммуникационных сетей и систем

Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №5

«МАТЕМАТИЧЕСКИЙ СОПРОЦЕССОР»

по дисциплине «Машинно-зависимые языки программирования»

Выполнил:

студент 1 курса

дневного отделения

группы ИКПИ-##

Фамилия И. О.

Санкт-Петербург 2019

А. Постановка задачи

Вычислить заданное вещественное выражение для исходных данных в форматах float и long int, используя арифметические операции сопроцессора.

Исходные значения переменных вводятся пользователем с клавиатуры. Они должны быть максимально приближены к максимально-возможным для тех типов данных, с которыми решается задача. Обмен данными между Си и ASM — модулем должен осуществляться через глобальные переменные, определенные в модуле Си.

Б. Разработка алгоритма

Все два формата данных будут продемонстрированы в одном проекте.

Входные данные состоят из 6 чисел A, C, D (long, float).

Выходные данные: числитель, знаменатель и результат вычисления на языке Си и ASM для каждого типа задания (long, float).

Размеры типов данных.

sizeof(float) = sizeof(long int) = DWORD (32 бита)

В. Таблица идентификаторов

N

Обозначение в задаче

Идентификатор

Назначение

1

A (long int)

iA

Входные данные

2

C (long int)

iC

3

D (long int)

iD

4

A (float)

fA

5

C (float)

fC

6

D (float)

fD

7

Числитель (long int)

iNum

Выходные данные

8

Знаменатель (long int)

iDen

9

Результат (long int)

iResult

10

Числитель (float)

fNum

11

Знаменатель (float)

fDen

12

Результат (float)

fResult

Г. Таблица результатов

Результаты вычислений приведены ниже в таблице вычислений.

Тип

A, C, D

Числитель

Знаменатель

Результат

INTEGER

5, 6, 7

C++: 71

ASM: 71

C++: 5

ASM: 5

C++: 14

ASM: 14

-5, -6, -7

C++: 71

ASM: 71

C++: -17

ASM: -17

C++: -4

ASM: -4

100, 200, 300

C++: 60029

ASM: 60029

C++: 294

ASM: 294

C++: 204

ASM: 204

-100, -200, -300

C++: 60029

ASM: 60029

C++: -306

ASM: -306

C++: -196

ASM: -196

FLOAT

5.5, 6.6, 7.7

C++: 79.82

ASM: 79.82

C++: 6.1

ASM: 6.1

C++: 13.085246

ASM: 13.085246

-5.5, -6.6, -7.7

C++: 79.82

ASM: 79.82

C++: -18.1

ASM: -18.1

C++: -4.409945

ASM: -4.409945

100.1,

200.2,

300.3

C++: 60149.054687

ASM: 60149.054687

C++: 294.299988

ASM: 294.299988

C++: 204.380081

ASM: 204.380081

-100.1,

-200.2,

-300.3

C++: 60149.054687

ASM: 60149.054687

C++: -306.299988

ASM: -306.299988

C++: -196.373016

ASM: -196.373016

Д. Программа

/* Файл CPP */

#include <iostream.h>

/// INTEGER

long iA, iC, iD, iNum, iDen, iResult;

/// FLOAT

float fA, fC, fD, fNum, fDen, fResult;

extern "C" { void Lab5i(); void Lab5f(); }

/// INTEGER

void i_C() {

iNum = 44 + iC * iD - 15;

iDen = iA + iC - 6;

iResult = iNum / iDen;

cout << "C: Numerator = " << iNum << endl;

cout << "C: Denominator = " << iDen << endl;

cout << "C: Result = " << iResult << endl;

}

void i_ASM() {

Lab5i();

cout << "ASM: Numerator = " << iNum << endl;

cout << "ASM: Denominator = " << iDen << endl;

cout << "ASM: Result = " << iResult << endl;

}

/// FLOAT

void f_C() {

fNum = 44 + fC * fD - 15;

fDen = fA + fC - 6;

fResult = fNum / fDen;

cout << "C: Numerator = " << fNum << endl;

cout << "C: Denominator = " << fDen << endl;

cout << "C: Result = " << fResult << endl;

}

void f_ASM() {

Lab5f();

cout << "ASM: Numerator = " << fNum << endl;

cout << "ASM: Denominator = " << fDen << endl;

cout << "ASM: Result = " << fResult << endl;

}

int main() {

cout << "INTEGER (" << sizeof(int) << ")" << endl;

cout << "Integer A: "; cin >> iA;

cout << "Integer C: "; cin >> iC;

cout << "Integer D: "; cin >> iD;

cout << "FLOAT (" << sizeof(float) << ")" << endl;

cout << "Float A: "; cin >> fA;

cout << "Float C: "; cin >> fC;

cout << "Float D: "; cin >> fD;

/// INTEGER

cout << "INTEGER" << endl;

i_C();

iNum = iResult = iDen = 0;

i_ASM();

/// FLOAT

cout << "FLOAT" << endl;

f_C();

fNum = fResult = fDen = 0;

f_ASM();

return 0;

}

; Файл ASM ;

.387

.MODEL Large,C

.data

Extrn C iA:DWORD, iD:DWORD, iC:DWORD, iNum:DWORD, iDen:DWORD, iResult:DWORD

Extrn C fA:DWORD, fD:DWORD, fC:DWORD, fNum:DWORD, fDen:DWORD, fResult:DWORD

number6 dd 6

number44 dd 44

number15 dd 15

.code

Public Lab5i

Lab5i proc far

FINIT

; Числитель

FILD iC

FIMUL iD

FIADD number44

FISUB number15

FISTP iNum

; Знаменатель

FILD iA

FIADD iC

FISUB number6

FISTP iDen

; Результат

FILD iNum

FIDIV iDen

FISTP iResult

ret

Lab5i endp

Public Lab5f

Lab5f proc far

FINIT

; Числитель

FLD fC

FMUL fD

FIADD number44

FISUB number15

FSTP fNum

; Знаменатель

FLD fA

FADD fC

FISUB number6

FSTP fDen

; Результат

FLD fNum

FDIV fDen

FSTP fResult

ret

Lab5f endp

end

Е. Выводы

Тот факт, что результаты, выполненные на ASM, достаточно совпадают с результатами, выполненными на C++, свидетельствует о том, что программа составлена правильно.

Соседние файлы в папке Примеры отчетов