Podniesienie wszystkich elementow wektora do kwadratu. [ASSEMBLER]

0

Witam napisałem program w assemblerze za pomocą koprocesora podnoszący wszystkie elementy wektora do kwadratu, który następnie umieścia je w tym samym wektorze. Niestesty po wyświetleniu tablicy w main wartości nie zostały podniesione do kwadratu. Też nie wiem czy w prawdłowy sposob umiesciam wartosci podniesione do kwadratu z powrotem do wektora.
Z góry dziękuje za pomoc!

 


#include "stdafx.h"
#include <iostream>
using namespace std;
void fun(double *tab,int n)
{
	double wynik = 0;
	__asm{
		mov ecx,n;  // rozmiar
		mov edi,tab; //adres początku wektora
		fld [edi]; // tab[0] na wierzchołek
		fld st;  // to samo
		fmul; // st:=st*st(1)
		fstp [edi]; // sciągniecie ze stosu
		dec ecx;
label:
		add edi,8; // następny element wektora
		fld [edi]; // tab[1] na wierzchołek
		fld st; 
		fmul; 
		fstp [edi];
		loop label;
	}
	
}

int _tmain(int argc, _TCHAR* argv[])
{
	int n= 10;
	double* tab = new double[n];
	for(int i = 0 ; i < n ; i++)
	{
		tab[i]=2;
	}
	fun(tab,n);
	for(int i = 0 ; i < n;i++)
	{
		cout << tab[i] << "\n";
	}
	system("pause");
	return 0;
}


0

Nie wiem czy Ci to pomoże w rozwikłaniu Twojego problemu.
Kompilacja na GCC:

#include <iostream>
using namespace std;
void fun(double *tab,int n)
{
    double wynik = 0;
    __asm volatile (
        "finit;"
	"mov ecx,%0;" 
        "mov edi,%1;"
        "fld qword ptr [edi];"
	"fld st;" 
        "fmul;"
        "fstp qword ptr [edi];"
        "dec ecx;"
"label:"
        "add edi,8;"
        "fld qword ptr [edi];"
	"fld st;"
        "fmul;" 
        "fstp qword ptr [edi];"
       "loop label;"
	: : "r" (n), "r"(tab):
    );
 
}
 
int main(int argc, char *argv[])
{
    int n= 10;
    double* tab = new double[n];

    for(int i = 0 ; i < n ; i++)
    {
        tab[i]=3.12+i;
    }
    fun(tab,n);
    for(int i = 0 ; i < n;i++)
    {
        cout << tab[i] << "\n";
    }
    return 0;
}
 

kompilacja:

g++ -masm=intel ./*.cpp
 

wynik:

9.7344
16.9744
26.2144
37.4544
50.6944
65.9344
83.1744
102.414
123.654
146.894
 

Wyniki takie ponieważ zmieniłem na "tab[i]=3.12+i;".

0

Bardzo dziękuje pomogło!

1 użytkowników online, w tym zalogowanych: 0, gości: 1