Article View: pl.comp.lang.asm
Article #1931Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja
From: MrokU
Date: Sat, 30 May 2009 10:45
Date: Sat, 30 May 2009 10:45
108 lines
4715 bytes
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-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>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