Консультация № 178140
01.05.2010, 10:46
0.00 руб.
01.05.2010, 20:14
0 5 1
Доброго времени суток дорогие эксперты:
Требуется с помощью ТАСМ реализовать решение задачи:
Написать программу (и прокомментировать её) для выполнения арифметической операции умножение над 2мя вещественными числами представленных в расширенном формате.

Хар-ки:
1) процессор intel core 2 solo CPU U3500
2) window vista home premium 32х разрядная
3) Turbo Assembler Version 4.1 в папке asm находится файл TASM поэтому думаю он предпочтителен
4) вычисления производить в сопроцессоре

Спасибо за внимание!

Обсуждение

Неизвестный
01.05.2010, 21:08
общий
"Расщиренный формат" - это не есть самый общеупотребительный термин. Понимается какой-о из стандартных для математического сопроцессора?
Неизвестный
03.05.2010, 10:31
общий
Цитата: 422
"Расщиренный формат" - это не есть самый общеупотребительный термин. Понимается какой-о из стандартных для математического сопроцессора?


Думаю да...я это уточню, просто никаких указаний не было
Неизвестный
03.05.2010, 15:44
общий
Ага. Сделайте ...
Неизвестный
03.05.2010, 19:53
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.

Насколько я понимаю, расширенный формат вещественных чисел соответствует типу long double в С (10-байтовые вещественные числа). Приведенная ниже функция умножения предназначена для вызова из программ для DOS, модель памяти COMPACT или LARGE (дальние указатели на данные).
Код:
; 178140a.asm
; умножение 2-х вещественных чисел, представленных в расширенном формате.
; TASM, сопроцессор

locals @@
.model compact, C
.386

.code
public mulx

.8086 ; переключаем на 8086, чтобы TASM сгенерировал
; PUSH BP/MOV BP,SP вместо ENTER

; long double mulx( const long double* p1, const long double* p2 );
proc mulx
arg @@p1: dword, @@p2: dword
uses si ; регистр SI нужно сохранять

LES si,[@@p1] ; указатель на первый сомножитель

; При генерации кода для 8086/8087 TASM вставляет инструкции WAIT
; перед каждой инструкцией сопроцессора.

.386

; Переключив на 80386/80387, мы исключаем ненужные для современных
; процессоров инструкции

fld tbyte ptr ES:[si] ; загружаем первый сомножитель в стек сопроцессора
LES si,[@@p2] ; указатель на второй сомножитель
fld tbyte ptr ES:[si] ; загружаем второй сомножитель в стек сопроцессора
fmulp st(1),st ; результат умножения - на вершине стека сопроцессора
.8086 ; переключаем на 8086, чтобы TASM сгенерировал POP BP вместо LEAVE
ret
endp mulx

end


Компиляция:
tasm -m2 -zn -mx %1

В приложении приведена тестовая программа для Borland C++. Для сборки создайте проект, в который поместите файл исходника (178140.с) и 178140a.obj.

Успехов!

Приложение:
/*
178140.c
тестовая программа для проверки функции умножения 2-х вещественных чисел,
представленных в расширенном формате (178140a.asm)
*/

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif
long double mulx( const long double* p1, const long double* p2 );
#ifdef __cplusplus
}
#endif

long double a = 1.25, b = 2.5, c;

int main()
{
c = mulx( &a, &b );
printf( "%Lg * %Lg = %Lg\n", a, b, c );
}
Неизвестный
03.05.2010, 19:58
общий
Юдин Евгений Сергеевич:
Конфигурация Вашего компьютера не имеет никакого отношения к целевой платформе. Из приведенного Вами списка
Цитата: 324791
1) процессор intel core 2 solo CPU U3500
2) window vista home premium 32х разрядная
3) Turbo Assembler Version 4.1 в папке asm находится файл TASM поэтому думаю он предпочтителен
4) вычисления производить в сопроцессоре

существенными являются пункты 3 (TASM) и 4 (инструкции сопроцессора). Ни один из этих пунктов не говорит о целевой платформе - под какой OS должна выполняться программа, код должен быть 16- или 32-битным.
Форма ответа