Страница 1 из 1
Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 25 май 2014, 01:39
Zingler
Здравствуйте! Проблема такая: Задали задание, нужно написать программу, в которой главнй модуль находится в языке С или С++, а дополнительный модуль в языке Ассемблера. Программа обязательно должна состоять из 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;
}
Помогите, пожалуйста написать код на Ассемблере. Перепробовал многое, не один из моих вариантов не работает. Уже даже не знаю в какую сторону правильно копать. Буду очень благодарен.
Re: Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 25 май 2014, 19:38
somewhere
Помочь можно, но для этого надо видеть что вы хоть что-то сделали, поэтому варианты решения в студию. Иначе получается что нужно написать код с нуля, а это только за деньги. Рабочий код займет примерно 8 - 10 инструкций
Re: Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 25 май 2014, 19:47
Zingler
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
Re: Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 25 май 2014, 22:49
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
На входе: Число_элементов: DWORD; Адрес_массива: DWORD;
На выходе: FPU ST(0): Среднее арифметическое.
Параметры со стека уничтожаются вызываемой процедурой.
Согласно модели вызова, результат функции находится в st(0)
Re: Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 26 май 2014, 17:18
Zingler
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
Я уже не знаю что делать...
Перепробовал уже многое..
НЕ могли бы вы мне еще раз помочь?
Re: Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Добавлено: 26 май 2014, 17:24
Zingler
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... вне зависимости от введеных данных.
НЕ могли бы вы мне помочь с этим еще раз? Буду вам очень благодарен..