🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#1931
From: MrokU
Date: Sat, 30 May 2009 10:45
108 lines
4715 bytes
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
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;

	mov ebx, tab				; zaladowanie adresu tablicy
	fld QWORD PTR [ebx+8]	; zaladowanie wartosci f(x)
	fstp t1					; zachowanie wartosci do zmiennej lokalnej, zwolnienie
stosu
	mov ebx, beta			; zaladowanie adresu zmiennej beta (liczonej przez
funkcje "Beta(j, n)"
	fld QWORD PTR [ebx]		; zaladowanie wartosci spod wskaznika beta
	fcos						; cosinus (beta)
	fadd st(0), st(0)			; 2 * cos (beta)
	fstp t2					; zachowanie powyzszej wartosci do lokalnej zmiennej

	mov eax, k				; zachowanie zmiennej k
	mov temp, eax
	inc temp					; temp = k+1
	mov eax, tab				; zachowanie adresu tablicy
	mov tempptr, eax
	add tempptr, 32			; przesuniecie sie do nastepnego elementu tablicy

	INVOKE wspU, n, temp, beta, tempptr	; wywolanie funkcji wspU (n, k+1,
beta, tab[k+1])

	fld QWORD PTR [eax]		; odczytanie wyniku zwroconego przez wspU
	fstp t3					; zapisanie wyniku

	mov eax, k				; zachowanie zmiennej k
	mov temp, eax
	inc temp					; temp = k+1
	inc temp					; temp = k+2
	mov eax, tab				; zachowanie adresu tablicy
	mov tempptr, eax
	add tempptr, 64			; przesuniecie sie w tablicy o 2 elementy

	INVOKE wspU, n, temp, beta, tempptr	; wywolanie funkcji wspU (n, k+2,
beta, tab[k+2])

	fld QWORD PTR [eax]		; odczytanie wyniku zwroconego przez wspU
	fstp t4					; zapisanie wyniku

	fld t4					; st2 = U(k+2)
	fld t3					; st1 = U(k+1)
	fld t2					; st0 = 2 * cos(beta)

	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

	jmp Koniec

Zwroc0:
	fldz						; ladujemy 0 do st0
	popad
	fstp QWORD PTR [eax]; zapisanie zera pod adres wynikowy

Koniec:
	ret ;koniec funkcji



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...

wspU ENDP
Technical Details
Message-ID: <f5c0cab0-caff-4858-bfad-4106556e0597@r13g2000vbr.googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!r13g2000vbr.googlegroups.com!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>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!news.nask.pl!news.nask.org.pl!newsfeed00.sul.t-online.de!t-online.de!border2.nntp.dca.giganews.com!nntp.giganews.com!postnews.google.com!r13g2000vbr.googlegroups.com!not-for-mail
From: MrokU <arkosmc@gmail.com>
Newsgroups: pl.comp.lang.asm
Subject: Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja
Date: Sat, 30 May 2009 03:45:51 -0700 (PDT)
Organization: http://groups.google.com
Lines: 109
Message-ID: <f5c0cab0-caff-4858-bfad-4106556e0597@r13g2000vbr.googlegroups.com>
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>
NNTP-Posting-Host: 83.28.193.77
Mime-Version: 1.0
X-Trace: posting.google.com 1243680351 22102 127.0.0.1 (30 May 2009 10:45:51 GMT)
X-Complaints-To: groups-abuse@google.com
NNTP-Posting-Date: Sat, 30 May 2009 10:45:51 +0000 (UTC)
Complaints-To: groups-abuse@google.com
Injection-Info: r13g2000vbr.googlegroups.com; posting-host=83.28.193.77;  posting-account=M89B8goAAADtNGu6YLcVvvVDLG2z3LY8
User-Agent: G2/1.0
X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.0.10)  Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729),gzip(gfe),gzip(gfe)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit