Article View: pl.comp.lang.asm
Article #1932Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja
From: Bogdan (bogdro)
Date: Sat, 30 May 2009 14:06
Date: Sat, 30 May 2009 14:06
94 lines
4358 bytes
4358 bytes
MrokU pisze:
[...]
> Generalnie wyliczać mam taki wzorek:
>
> U(k) = f(x) + 2 * U(k+1) * cos(B) - U(k+2)
[...]
> Na razie, po pierwszych próbach funkcja (oczywiście nie działa dobrze)
> wygląda tak:
>
> ;******************************************************************
> ;****** Procedura obliczajaca pierwsze 2 wyrazy ciagu Un
> ;****** Wg wzoru:
> ;****** double U (int k, double beta, Element *tab) //obliczanie
> wspólczynnika U - wzór 28
> ;****** {
> ;****** if ( k > n )
> ;****** return (0.0);
> ;****** else
> ;****** return (tab[k].f_x + (2.0) * ( U(k+1, beta, tab) * cosf
> (beta) ) - U(k+2, beta, tab));
> ;****** }
>
> ;****** definicja elementu tablicy
>
> ;****** struct Element
> ;****** {
> ;****** double x;
> ;****** double f_x;
> ;****** double g_x;
> ;****** double blad;
> ;****** };
>
> wspU PROC n:DWORD, k:DWORD, beta:PTR, tab:PTR
Wiesz, że ten prototyp wygląda inaczej niż ten z C i musisz tę
funkcję (znacznie) inaczej uruchamiać, prawda?
> LOCAL t1:QWORD, t2:QWORD, t3:QWORD, t4:QWORD, temp:DWORD, tempptr:PTR
> pushad
> finit
>
> mov eax, k
> cmp eax, n ; if (k > n)
>
> ja Zwroc0 ; return 0;
Załóżmy najpierw, że w tym punkcie warunek jest spełniony i skok JA
wykonany. W końcu kiedyś będzie się to musiało zdarzyć. Spójrz teraz,
co się dzieje pod "Zwroc0".
[...]
> fmul st(0), st(1) ; st0 = 2 * cos(beta) * U(k+1)
> fld t1 ; st0 = f(x)
> fadd st(0), st(1) ; st0 = f(x) + 2 * cos(beta) * U(k+1)
> fsub st(0), st(3) ; st0 = f(x) + 2 * cos(beta) * U(k+1) - U(k+2)
>
> popad
>
> fstp QWORD PTR [eax] ; zapisanie wyniku
Ta sama uwaga, co poniżej dla zwracania zera.
> jmp Koniec
>
> Zwroc0:
> fldz ; ladujemy 0 do st0
> popad
> fstp QWORD PTR [eax]; zapisanie zera pod adres wynikowy
Wielkie pytanie, co jest w EAX w tym miejscu, gdy "ja Zwroc0"
zostanie wykonane. A z resztą, nawet jak nie będzie wykonane, to co
jest w EAX? Wykonując POPAD, przywracasz wartość z momentu
uruchomienia funkcji, a rejestr EAX jest używany dowolnie, więc jego
wartość jest nieokreślona. Piszesz więc pod nieznany adres (przy
pierwszym uruchomieniu funkcji). Inicjalizuj EAX na tyle, ile trzeba
(czyli pewnie tab+8).
> No i teraz nie wiem dlaczego, ale modyfikowane są wartości tab[].x
> czyli te, pod adresami tab + x * 32 (bo tyle zajmują 4 double).
>
> na szczęście błąd ten jest mało ważny. Jednak dla identycznych
> parametrów, funkcja w C i w ASMie zwraca zupełnie inne wyniki i tego
> już nie kumam... Patrze w te instrukcje i nie widzę gdzie może być
> błąd...
Pewnie wszystko wina niezainicjalizowanych wskaźników. Jeśli nie, to
pokaż kod wywołujący.
--
Pozdrawiam/Regards - Bogdan (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):http://rudy.mif.pg.gda.pl/~bogdro
Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.JabberPL.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft
Technical Details
Message-ID:
<gvrei4$l9v$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<29a4a4e4-9913-4afa-ba78-63b3168b1c91@r34g2000vbi.googlegroups.com> <1800926.ER7XFjMh0G@meehow.homeip.net> <6a3c09a9-6a40-491a-8d0b-aebe884ddeb9@k38g2000yqh.googlegroups.com> <gvh3mf$a3r$1@inews.gazeta.pl> <0350c547-38dd-4ffd-9348-994f087be99e@21g2000vbk.googlegroups.com> <gvhacl$b4v$1@inews.gazeta.pl> <4cd17bbe-78cb-4b0c-8dcf-d71287d4f307@x3g2000yqa.googlegroups.com> <f5c0cab0-caff-4858-bfad-4106556e0597@r13g2000vbr.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja Date: Sat, 30 May 2009 16:06:58 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 94 Message-ID: <gvrei4$l9v$1@inews.gazeta.pl> References: <29a4a4e4-9913-4afa-ba78-63b3168b1c91@r34g2000vbi.googlegroups.com> <1800926.ER7XFjMh0G@meehow.homeip.net> <6a3c09a9-6a40-491a-8d0b-aebe884ddeb9@k38g2000yqh.googlegroups.com> <gvh3mf$a3r$1@inews.gazeta.pl> <0350c547-38dd-4ffd-9348-994f087be99e@21g2000vbk.googlegroups.com> <gvhacl$b4v$1@inews.gazeta.pl> <4cd17bbe-78cb-4b0c-8dcf-d71287d4f307@x3g2000yqa.googlegroups.com> <f5c0cab0-caff-4858-bfad-4106556e0597@r13g2000vbr.googlegroups.com> NNTP-Posting-Host: pasquino.netelligent.ca Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1243692423 21823 209.44.114.178 (30 May 2009 14:07:03 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Sat, 30 May 2009 14:07:03 +0000 (UTC) X-User: bog.d In-Reply-To: <f5c0cab0-caff-4858-bfad-4106556e0597@r13g2000vbr.googlegroups.com> User-Agent: Thunderbird 2.0.0.21 (X11/20090302) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit