Ассемблер и С++. Найти среднее арифметического массива (intel x86)

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Zingler
Сообщения: 2
Зарегистрирован: 25 май 2014, 01:36

25 май 2014, 01:39

Здравствуйте! Проблема такая: Задали задание, нужно написать программу, в которой главнй модуль находится в языке С или С++, а дополнительный модуль в языке Ассемблера. Программа обязательно должна состоять из 2 раздельный файлов, т.е Нельзя встроить код ассемблера в код С. Из главного модуля передаю количество элементов массива, и указатель на первый елемент массива. В ассемблере с помощью Сопроцессора нужно найти среднее арифметическое этих чисел и вернуть в функцию. Проблема заключается в том, что этот массив должен быть либо типа double либо float.
Код написаный на С++:


#include <iostream.h>
#define L 5

extern "C" float Srednia(float* tab, int G);

int main()
{
float tab[L]={0};
cout<<"Enter array: \n";
for(int i=0; i<L; i++)
cin>>tab;
cout<<"Average value of entered array = "<<Srednia(tab, L);
cout<<"\nThe end of the programm\n";
return 0;
}




Помогите, пожалуйста написать код на Ассемблере. Перепробовал многое, не один из моих вариантов не работает. Уже даже не знаю в какую сторону правильно копать. Буду очень благодарен.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 май 2014, 19:38

Помочь можно, но для этого надо видеть что вы хоть что-то сделали, поэтому варианты решения в студию. Иначе получается что нужно написать код с нуля, а это только за деньги. Рабочий код займет примерно 8 - 10 инструкций
It's a long way to the top if you wanna rock'n'roll
Zingler
Сообщения: 2
Зарегистрирован: 25 май 2014, 01:36

25 май 2014, 19:47

somewhere писал(а):Помочь можно, но для этого надо видеть что вы хоть что-то сделали, поэтому варианты решения в студию. Иначе получается что нужно написать код с нуля, а это только за деньги. Рабочий код займет примерно 8 - 10 инструкций
Вот то что я написал на ассемблере:

.386
.model SMALL,c
PUBLIC Srednia
.stack 400h
.data
one dd 1.0
.code
Srednia PROC

push ebp
mov esp,ebp

push esi
mov ecx, [ebp+12]

finit
fldz

do:
fld dword PTR one
fld dword PTR [esi]
fdivp st(1), st(0)
faddp st(1),st(0)
add esi,4
loop do

pop esi
pop ebp
ret

Srednia ENDP
END

ошибка при компиляции
Fatal : 32-bit record encountered in module
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

25 май 2014, 22:49

Код: Выделить всё

Srednia PROC

push ebp
mov ebp, esp
push esi 
mov ecx, [ebp+12] 
mov esi, [ebp+8]
finit 
fldz 
    @do:
fadd dword ptr [esi+ecx-4]
loop @do
fidiv dword ptr [ebp+12]
pop esi
pop ebp
ret 8

Srednia ENDP
На входе: Число_элементов: DWORD; Адрес_массива: DWORD;
На выходе: FPU ST(0): Среднее арифметическое.

Параметры со стека уничтожаются вызываемой процедурой.
Согласно модели вызова, результат функции находится в st(0)
It's a long way to the top if you wanna rock'n'roll
Zingler
Сообщения: 2
Зарегистрирован: 25 май 2014, 01:36

26 май 2014, 17:18

somewhere писал(а):

Код: Выделить всё

Srednia PROC

push ebp
mov ebp, esp
push esi 
mov ecx, [ebp+12] 
mov esi, [ebp+8]
finit 
fldz 
    @do:
fadd dword ptr [esi+ecx-4]
loop @do
fidiv dword ptr [ebp+12]
pop esi
pop ebp
ret 8

Srednia ENDP
Спасибо большое. Вот я толкьо разобратся не могу.
ПРограмма запускается, но работает не правильно. В зависимости от размера массива, разный ответ. Например если размер массива 3 то ответ всегда будет 3.876076

Я уже не знаю что делать...
Перепробовал уже многое..

НЕ могли бы вы мне еще раз помочь?
Zingler
Сообщения: 2
Зарегистрирован: 25 май 2014, 01:36

26 май 2014, 17:24

somewhere писал(а):

Код: Выделить всё

Srednia PROC

push ebp
mov ebp, esp
push esi 
mov ecx, [ebp+12] 
mov esi, [ebp+8]
finit 
fldz 
    @do:
fadd dword ptr [esi+ecx-4]
loop @do
fidiv dword ptr [ebp+12]
pop esi
pop ebp
ret 8

Srednia ENDP
Спасибо огрмное! Но я вот правда что не могу разобрася...
Програма запускается но работает не правильно..
Если размер массива равен 3 елементам, то при любом раскладе, ответ будет 3,8... вне зависимости от введеных данных.

НЕ могли бы вы мне помочь с этим еще раз? Буду вам очень благодарен..
Ответить