Assembler obliczanie funkcji w koprocesorze.

0

Witam program oblicza funkcje y = ax3 + bx2 + cx + d, niestety nie do końca go rozumiem.

  1. Nie jestem pewien od której strony zaczynać definiowanie takiej funkcji. W tym wypadku udało się to zrobić od prawej.

  2. faddp st(3),st ; sciaga z wierzcholka stosu parametr i dodaje do st(3) st(0) i sytuacja na stosie wygląda tak : xx,x,axxx+d , natomiast faddp st(2),st; //x,axxx+b*xx+d
    Nie rozumiem, dlaczego po powyższej instrukcji sytutacja na stosie nie wygląda tak: axxx+d + b*xx

  3. Czy zna ktoś stronkę, gdzię są rozwiązane podobne zadania, a do tego opisane ?

__asm {
   fld d; //d
   fldx; //x,d
   fld st; //x,x,d
   fmul st,st(1); // xx,x,d
   fld st(1); // x,xx,x,d
   fmul st,st(1); // xxx,xx,x,d
   fmul a; // axxx, xx, x, d
   faddp st(3),st; // xx,x,axxx+d
   fmul b; // b^xx, x, axxx+d
   faddp st(2),st; //x,axxx+b*xx+d
   fmul c; // c*x,axxx+b*xx+d
   fadd ; // axxx+b*xx+c*x+d
   fstp y;
}
0

Najsensowniej zliczać to przecież od niskich potęg X, jakakolwiek inna opcja byłaby po prostu glupia. Logika nakazuje żeby zrobić tak:

  • wrzucasz na stos koprocesora na pozycje A wartość 1 (x0)
  • wrzucasz na stos wyraz wolny wielomianu i mnożysz go przez wartość na pozycji A
  • mnożysz wartość na pozycji A przez X (więc mamy tam x1)
  • wrzucasz na stos wyraz wielomianu przy x i mnozysz go przez wartość na pozycji A
  • mnożysz wartość na pozycji A przez X (więc mamy tam x2)
    ...
    Ostatnie 2 linijki powtarzasz. Algorytm będzie działał dla dowolnego wielomianu, nie tylko stopnia 3.
0
double poly(double x,double a,double b,double c,double d)
{
	return a*x*x*x + b*x*x + c*x + d;
}
00401019 DD 44 24 40      fld         qword ptr [esp+40h] 
0040101D D9 C0            fld         st(0) 
0040101F D8 C9            fmul        st,st(1) 
00401021 D8 C9            fmul        st,st(1) 
00401023 D9 C1            fld         st(1) 
00401025 DC C0            fadd        st(0),st 
00401027 D8 CA            fmul        st,st(2) 
00401029 DE C1            faddp       st(1),st 
0040102B D9 C9            fxch        st(1) 
0040102D DC 0D 08 21 40 00 fmul        qword ptr [__real@4008000000000000 (402108h)] 
00401033 DE C1            faddp       st(1),st 
00401035 DC 05 00 21 40 00 fadd        qword ptr [__real@4010000000000000 (402100h)] 
0040103B DD 1C 24         fstp        qword ptr [esp] 
0

Warto w tym miejscu wposmnieć o intrukcji assemblera "FINIT" - inicjuj koprocesor.

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