Article View: pl.comp.lang.asm
Article #1918Re: Visual Studio 2008 (C++ oraz DLL w asmie) Interpolacja
From: Bogdan (bogdro)
Date: Mon, 25 May 2009 16:05
Date: Mon, 25 May 2009 16:05
110 lines
4415 bytes
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-mailReferences:
<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