Здравствуйте! Проблема такая: Задали задание, нужно написать программу, в которой главнй модуль находится в языке С или С++, а дополнительный модуль в языке Ассемблера. Программа обязательно должна состоять из 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;
}
Помогите, пожалуйста написать код на Ассемблере. Перепробовал многое, не один из моих вариантов не работает. Уже даже не знаю в какую сторону правильно копать. Буду очень благодарен.
Ассемблер и С++. Найти среднее арифметического массива (intel x86)
Модератор: Andy
Помочь можно, но для этого надо видеть что вы хоть что-то сделали, поэтому варианты решения в студию. Иначе получается что нужно написать код с нуля, а это только за деньги. Рабочий код займет примерно 8 - 10 инструкций
It's a long way to the top if you wanna rock'n'roll
Вот то что я написал на ассемблере: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
Код: Выделить всё
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
На выходе: FPU ST(0): Среднее арифметическое.
Параметры со стека уничтожаются вызываемой процедурой.
Согласно модели вызова, результат функции находится в st(0)
It's a long way to the top if you wanna rock'n'roll
Спасибо большое. Вот я толкьо разобратся не могу.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
Я уже не знаю что делать...
Перепробовал уже многое..
НЕ могли бы вы мне еще раз помочь?
Спасибо огрмное! Но я вот правда что не могу разобрася...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... вне зависимости от введеных данных.
НЕ могли бы вы мне помочь с этим еще раз? Буду вам очень благодарен..