🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#1918
From: Bogdan (bogdro)
Date: Mon, 25 May 2009 16:05
110 lines
4415 bytes
MrokU pisze:
> To może tak:
> wkleję tutaj kod, który mi działa, ale zapewne wiele rzeczy jest
> nieoptymalnie, niefajnie, etc.
> Czy ktoś może rzucić na to okiem i powiedzieć co i jak robić lepiej?
> pozdrawiam.

[...]

> ;******	Procedura testowa ***** dodawanie
> 
> sumuj PROC a: DWORD , b: DWORD
> 	pushad
> 	mov eax, a
> 	add b, eax
> 	popad
> 	mov eax, b
> 	ret            ;koniec funkcji
> sumuj ENDP

 Możesz nie pisać PUSHAD i POPAD, bo używasz tylko rejestru EAX, który
nie tylko można dowolnie zmieniać, ale przy wyjściu zawiera wynik.
Podobnie w kilku innych procedurach.

> ;******	Procedura testowa ***** HARDCORE - sinus()
> 
> sinus PROC kat:DQ;, wynik:PTR
> 	pushad
> 	finit
> 	fld	kat			; wczytanie zmiennej do rejestru st0
> 	fsin
> 	fst kat
> 	popad
> 	mov eax, kat
> 	ret            ;koniec funkcji
> sinus ENDP

 Oj, tu niedobrze. Pomijając PUSHAD/POPAD, wykonywanie FINIT może być
dość kosztowne czasowo i raczej powinno się to robić tylko raz, przy
starcie programu (chyba że naprawdę potrzebny jest reset). Większy
problem jest w tym, że wkładasz coś na stos i nie zdejmujesz - po 8
uruchomieniach się przepełni (pewnie dlatego robiłeś FINIT). Zamiast
FST użyj FSTP. Nawet jeśli nigdzie indziej nie używasz koprocesora,
rób tak dla zasady.
 Swoją drogą, chyba "wynik" jest od tego, by otrzymać wynik, a nie "kat"?


> #include <windows.h>
> #include <stdio.h>
> #include <iostream>
> #define PI
> 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

 Czemu nie użyjesz stałych "firmowych" (jeśli są dostępne, oczywiście)?

#include <math.h>
#ifndef M_PI
#define M_PI 3.141592653589793238462643383279502884197 blablabla...
#endif


> //---------------------------------------------------------------------------
> 
> typedef int (__stdcall *MYPROC)(int, int);
> typedef float (__stdcall *MYPROC2)(float);
> 
> MYPROC ProcAdd, ProcSub;
> MYPROC2 ProcSin;
> HINSTANCE hinstLib;
> int a, b;
> float d;
> 
> int main(int argc, char* argv[])
> {
> 	hinstLib = LoadLibrary ("DLLint.dll");	//ladowanie biblioteki
> 	if (hinstLib == NULL)			//sprawdzenie, czy moduł faktycznie
> został załadowany
> 		return 1;
> 
> 	ProcAdd = (MYPROC) GetProcAddress(hinstLib, "sumuj");
> 	if (NULL != ProcAdd)
> 		a = (ProcAdd)(9,2);

 Formalnie to pewnie powinno być

		a = (*ProcAdd)(9,2);

 jako że "ProcAdd" jest wskaźnikiem. Ale jak działa, to dobrze.

[...]

> 		d = (ProcSin)(PI / 6);	// sinus 30 stopni

 W tym błędu nie ma, ale jak będziesz potrzebował szybkiego działania,
używaj stałych, bez obliczeń, np.

#define M_PI_6 0.5235987755982988527 /* M_PI / 6 */
		d = (*ProcSin)(M_PI_6);

 aby od razu przekazywać parametr do funkcji, bez zbędnych obliczeń na
stałych (a na przykład dzielenie jest akurat kosztowne).
 Pewnie mądry kompilator i tak by tu wstawił stałą, ale co jeśli nie?

 Tyle ja zauważyłem na pierwszy rzut oka. Może ktoś jeszcze coś dołoży.

-- 
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: <gvefkf$lke$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> <gvb3au$aha$1@inews.gazeta.pl> <gvcsv7$9li$1@inews.gazeta.pl> <1c78221a-e9ea-4795-ac7b-2b3d014f556b@r33g2000yqn.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: Mon, 25 May 2009 18:05:34 +0200
Organization: "Portal Gazeta.pl -> http://www.gazeta.pl"
Lines: 110
Message-ID: <gvefkf$lke$1@inews.gazeta.pl>
References: <29a4a4e4-9913-4afa-ba78-63b3168b1c91@r34g2000vbi.googlegroups.com>  <gvb3au$aha$1@inews.gazeta.pl> <gvcsv7$9li$1@inews.gazeta.pl> <1c78221a-e9ea-4795-ac7b-2b3d014f556b@r33g2000yqn.googlegroups.com>
NNTP-Posting-Host: 84.38.66.15
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1243267538 22158 84.38.66.15 (25 May 2009 16:05:38 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Mon, 25 May 2009 16:05:38 +0000 (UTC)
X-User: bog.d
In-Reply-To: <1c78221a-e9ea-4795-ac7b-2b3d014f556b@r33g2000yqn.googlegroups.com>
User-Agent: Thunderbird 2.0.0.21 (X11/20090302)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit