Примеры отчетов / ASM. Лаб. 5
.docx
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"
Факультет инфокоммуникационных сетей и систем
Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №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++, свидетельствует о том, что программа составлена правильно.