🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #1932

Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja

#1932
From: Bogdan (bogdro)
Date: Sat, 30 May 2009 14:06
94 lines
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-mail
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>

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