Strona 1 z 2
1 2 OstatniOstatni
Pokaż wyniki od 1 do 20 z 27

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

  1. #1
    MrokU
    Guest

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

    Witam,
    zupełnie nie znam asemblera, a muszę napisać bibliotekę dll, służącą
    do interpolacji algorytmem Goertzel`a.

    Wymyśliłem sobie, żeby do biblioteki przekazywać listę / tablicę
    węzłów interpolacji (czyli punktów, w których funkcja wyjściowai
    wejściowa muszą się zgadzać) i dla nich wyliczać wartość funkcji
    interpolującej.

    Czy ktoś może mi podpowiedzieć od czego w ogóle zacząć, podrzucić
    jakieś tutoriale do tworzenia bibliotek dll, wymiany danych między C/C+
    + i biblioteką dll w asmie?

    Ewentualnie, czy ktoś, kto się na tym zna byłby skory coś takiego
    napisać?

    pozdrawiam

  2. #2
    Bogdan (bogdro)
    Guest

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

    MrokU pisze:
    > Witam,
    > zupełnie nie znam asemblera, a muszę napisać bibliotekę dll, służącą
    > do interpolacji algorytmem Goertzel`a.
    >
    > Wymyśliłem sobie, żeby do biblioteki przekazywać listę / tablicę
    > węzłów interpolacji (czyli punktów, w których funkcja wyjściowa i
    > wejściowa muszą się zgadzać) i dla nich wyliczać wartość funkcji
    > interpolującej.
    >
    > Czy ktoś może mi podpowiedzieć od czego w ogóle zacząć, podrzucić
    > jakieś tutoriale do tworzenia bibliotek dll, wymiany danych między C/C+
    > + i biblioteką dll w asmie?


    Odpowiedziano na forum.

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

  3. #3
    MrokU
    Guest

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

    Wiem, widziałem już.

    Pozostaje jeszcze pytanie, czy ktoś osobiście (lub znajomi) robi tego
    typu projekty, że tak powiem odpłatnie?

    pozdrawiam

  4. #4
    Bogdan
    Guest

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

    Użytkownik "Bogdan (bogdro)" napisał:

    > Odpowiedziano na forum.


    Na jakim forum? Można prosić o oświecenie mnie?

    Do MrokU:

    Parę DLL-ek pod Windows w asemblerze napisałem. Mogę co nieco podpowiedzieć.
    Mój e-mail z nagłówka jest fałszywy. To tak na wszelki.

    Remek


  5. #5
    MrokU
    Guest

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

    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.


    -----------------------------------------------------------------------------------------------------------------
    KOD DLL:
    ..586
    ..387

    ..MODEL FLAT, STDCALL

    OPTION CASEMAP:NONE

    INCLUDE .\masm32\include\windows.inc;
    INCLUDE .\masm32\include\user32.inc
    INCLUDE .\masm32\include\kernel32.inc
    INCLUDELIB .\masm32\lib\user32.lib
    INCLUDELIB .\masm32\lib\kernel32.lib

    ..DATA
    ..CODE

    DllEntry PROC hInstance:HINSTANCE, reasonWORD, reserved1WORD
    mov eax, TRUE
    ret
    DllEntry ENDP

    ;************************************************* **************
    ;****** 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

    ;************************************************* **************
    ;****** Procedura testowa ***** odejmowanie

    odejmuj PROC a: DWORD , b: DWORD
    pushad
    mov eax, a
    sub b, eax
    popad
    mov eax, b
    ret ;koniec funkcji
    odejmuj ENDP

    ;************************************************* **************
    ;****** Procedura testowa ***** HARDCORE - sinus()

    sinus PROC katQ;, wynik:PTR
    pushad
    finit
    fld kat ; wczytanie zmiennej do rejestru st0
    fsin
    fst kat
    popad
    mov eax, kat
    ret ;koniec funkcji
    sinus ENDP

    END DllEntry


    -----------------------------------------------------------------------------------------------------------------
    KOD C++:

    #include <windows.h>
    #include <stdio.h>
    #include <iostream>

    #define PI
    3.141592653589793238462643383279502884197169399375 10582097494459230781640628620899862803482534211706 79
    //---------------------------------------------------------------------------

    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);

    ProcSub = (MYPROC) GetProcAddress(hinstLib, "odejmuj");
    if (NULL != ProcAdd)
    b = (ProcSub)(2,9);

    ProcSin = (MYPROC2) GetProcAddress(hinstLib, "sinus");
    if (NULL != ProcAdd)
    d = (ProcSin)(PI / 6); // sinus 30 stopni

    FreeLibrary(hinstLib);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << d << std::endl;

    system("PAUSE");
    return 0;
    }

    -----------------------------------------------------------------------------------------------------------------
    pozdrawiam.

  6. #6
    MrokU
    Guest

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


  7. #7
    Bogdan (bogdro)
    Guest

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

    Bogdan pisze:
    > Użytkownik "Bogdan (bogdro)" napisał:
    >
    >> Odpowiedziano na forum.

    >
    > Na jakim forum? Można prosić o oświecenie mnie?


    Oczywiście: http://profesor.niesfornazyta.pl/
    [...]

    > Remek


    Podpisujesz się na raz "Remek" i "Bogdan"?

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

  8. #8
    Bogdan (bogdro)
    Guest

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

    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 katQ;, 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.141592653589793238462643383279502884197169399375 10582097494459230781640628620899862803482534211706 79


    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

  9. #9
    MrokU
    Guest

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

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


    No właśnie muszę używać, bo Visual mi się pluje, że coś robię nie tak
    z rejestrem ESI. Nie wiem o co chodzi, ale jak te instrukcje dodam, to
    żadnych błędów mi nie wyrzuca...

    > *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"?


    o FINIT nie wiedziałem. Jak na razie to jedyna funkcja, która używa
    liczb zmiennoprzecinkowych, ale domyślnie będzie to działało tak, że
    jedna duża funkcja będzie liczyła interpolację dla danego punktu, w
    związku z tym FINIT będzie tylko raz (aczkolwiek to na razie plany).
    Wynik jest do tego, żeby sobie spróbować zwrócić wynik w inny sposób
    niż przez eax, ale jak na razie tego nie robiłem, bo nie do końca wiem
    jak :P chociaż pewnie trzeba przekazać wskaźnik i modyfikować adres..
    Tylko nie zastanawiałem się jeszcze jak to robić.

    > > #include <windows.h>
    > > #include <stdio.h>
    > > #include <iostream>
    > > #define PI
    > > 3.141592653589793238462643383279502884197169399375 10582097494459230781640628620899862803482534211706 79

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


    nie widziałem sensu dołączania całej biblioteki, skoro potrzebuję
    tylko PI (chociaż jak już mówiłem, to są dopiero próby i przymierzanie
    się do pisania programu).

    No a z liczeniem sinusa 30 stopni, to nie ma sensu robić to z #define,
    bo nie będę liczył stałych wartości kątów. Wszystko leci na wzorach i
    będzie wyliczane na bieżąco.


  10. #10
    Remek
    Guest

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

    Użytkownik "Bogdan (bogdro)" napisał:

    > Podpisujesz się na raz "Remek" i "Bogdan"?


    Nie do końca. Podpis był mój, ale gościnnie skorzystałem z innego komputera
    i konta, zapominając o skutkach. Przepraszam za zamieszanie. Nie powinno się
    powtórzyć.

    Pozdrawiam Remek



  11. #11
    MrokU
    Guest

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

    A czy wiecie może, co może być skutkiem nagłej zmiany w Windowsach i
    wysypu błędów?

    Bo w pewnym momencie coś się VS odwidziało i kod, który się normalnie
    kompilował, nagle wyrzuca coś takiego (dla pewności kompilowany kod):


    -----------------------------------------------------------------------------------------------------------------
    C++
    #include <windows.h>
    #include <stdio.h>
    #include <iostream>

    #define PI 3.1415926535897932


    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);

    ProcSub = (MYPROC) GetProcAddress(hinstLib, "odejmuj");
    if (NULL != ProcAdd)
    b = (ProcSub)(2,9);

    ProcSin = (MYPROC2) GetProcAddress(hinstLib, "sinus");
    if (NULL != ProcAdd)
    d = (ProcSin)(PI / 6); // sinus 30 stopni

    FreeLibrary(hinstLib);
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << d << std::endl;

    system("PAUSE");
    return 0;
    }
    -----------------------------------------------------------------------------------------------------------------
    ASM
    ..586
    ..387

    ..MODEL FLAT, STDCALL

    OPTION CASEMAP:NONE

    INCLUDE .\masm32\include\windows.inc;
    INCLUDE .\masm32\include\user32.inc
    INCLUDE .\masm32\include\kernel32.inc
    INCLUDELIB .\masm32\lib\user32.lib
    INCLUDELIB .\masm32\lib\kernel32.lib

    ..DATA
    ..CODE

    DllEntry PROC hInstance:HINSTANCE, reasonWORD, reserved1WORD
    mov eax, TRUE
    ret
    DllEntry ENDP

    ;************************************************* **************
    ;****** 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

    ;************************************************* **************
    ;****** Procedura testowa ***** odejmowanie

    odejmuj PROC a: DWORD , b: DWORD
    pushad
    mov eax, a
    sub b, eax
    popad
    mov eax, b
    ret ;koniec funkcji
    odejmuj ENDP

    ;************************************************* **************
    ;****** Procedura testowa ***** HARDCORE - sinus()

    sinus PROC katQ
    pushad
    finit
    fld kat ; wczytanie zmiennej do
    rejestru st0
    fsin
    fst kat
    popad
    mov eax, kat
    ret ;koniec funkcji
    sinus ENDP

    END DllEntry
    -----------------------------------------------------------------------------------------------------------------
    DEF
    LIBRARY DLLint
    EXPORTS sumuj
    EXPORTS odejmuj
    EXPORTS sinus
    -----------------------------------------------------------------------------------------------------------------
    KOMPILACJA:
    1>------ Rebuild All started: Project: interJA, Configuration: Debug
    Win32 ------
    1>Deleting intermediate and output files for project 'interJA',
    configuration 'Debug|Win32'
    2>------ Rebuild All started: Project: DLLint, Configuration: Debug
    Win32 ------
    2>Deleting intermediate and output files for project 'DLLint',
    configuration 'Debug|Win32'
    2>Assembling...
    1>Compiling...
    1>main.cpp
    2> Assembling: .\DLLint.asm
    2>.\DLLint.asm(1) : error A2044: invalid character in file
    2>.\DLLint.asm(2) : error A2008: syntax error : .
    2>.\DLLint.asm(4) : error A2008: syntax error : .
    2>.\DLLint.asm(6) : error A2008: syntax error : P
    2>.\DLLint.asm(8) : error A2109: only white space or comment can
    follow backslash
    2>.\DLLint.asm(10) : error A2109: only white space or comment can
    follow backslash
    2>.\DLLint.asm(12) : error A2109: only white space or comment can
    follow backslash
    2>.\DLLint.asm(14) : error A2109: only white space or comment can
    follow backslash
    2>.\DLLint.asm(16) : error A2109: only white space or comment can
    follow backslash
    2>.\DLLint.asm(19) : error A2008: syntax error : .
    2>.\DLLint.asm(20) : error A2008: syntax error : .
    2>.\DLLint.asm(22) : error A2008: syntax error : l
    2>.\DLLint.asm(23) : error A2008: syntax error : m
    2>.\DLLint.asm(24) : error A2008: syntax error : r
    2>.\DLLint.asm(25) : error A2008: syntax error : D
    2>.\DLLint.asm(30) : error A2008: syntax error : u
    2>.\DLLint.asm(31) : error A2008: syntax error : p
    2>.\DLLint.asm(32) : error A2008: syntax error : m
    2>.\DLLint.asm(33) : error A2008: syntax error : a
    2>.\DLLint.asm(34) : error A2008: syntax error : p
    2>.\DLLint.asm(35) : error A2008: syntax error : m
    2>.\DLLint.asm(36) : error A2008: syntax error : r
    2>.\DLLint.asm(37) : error A2008: syntax error : s
    2>.\DLLint.asm(42) : error A2008: syntax error : d
    2>.\DLLint.asm(43) : error A2008: syntax error : p
    2>.\DLLint.asm(44) : error A2008: syntax error : m
    2>.\DLLint.asm(45) : error A2008: syntax error : s
    2>.\DLLint.asm(46) : error A2008: syntax error : p
    2>.\DLLint.asm(47) : error A2008: syntax error : m
    2>.\DLLint.asm(48) : error A2008: syntax error : r
    2>.\DLLint.asm(49) : error A2008: syntax error : o
    2>.\DLLint.asm(54) : error A2008: syntax error : i
    2>.\DLLint.asm(55) : error A2008: syntax error : p
    2>.\DLLint.asm(56) : error A2008: syntax error : f
    2>.\DLLint.asm(57) : error A2008: syntax error : f
    2>.\DLLint.asm(58) : error A2008: syntax error : f
    2>.\DLLint.asm(59) : error A2008: syntax error : f
    2>.\DLLint.asm(60) : error A2008: syntax error : p
    2>.\DLLint.asm(61) : error A2008: syntax error : m
    2>.\DLLint.asm(62) : error A2008: syntax error : r
    2>.\DLLint.asm(63) : error A2008: syntax error : s
    2>.\DLLint.asm(65) : error A2008: syntax error : E
    2>.\DLLint.asm(65) : error A2088: END directive required at end of
    file
    2>Project : error PRJ0019: A tool returned an error code from
    "Assembling..."
    1>c:\documents and settings\ala\desktop\interja\interja\main.cpp(33) :
    warning C4305: 'argument' : truncation from 'double' to 'float'
    2>Build log was saved at "file://c:\Documents and Settings\Ala\Desktop
    \interJA\DLLint\Debug\BuildLog.htm"
    2>DLLint - 44 error(s), 0 warning(s)
    1>Compiling manifest to resources...
    1>Linking...
    1>LINK : C:\Documents and Settings\Ala\Desktop\interJA\Debug
    \interJA.exe not found or not built by the last incremental link;
    performing full link
    1>Embedding manifest...
    1>Build log was saved at "file://c:\Documents and Settings\Ala\Desktop
    \interJA\InterJA\Debug\BuildLog.htm"
    1>interJA - 0 error(s), 1 warning(s)
    ========== Rebuild All: 1 succeeded, 1 failed, 0 skipped ==========

  12. #12
    Michal Schulz
    Guest

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

    MrokU wrote:

    > zupełnie nie znam asemblera, a muszę napisać bibliotekę dll,


    Nie chce sie wtracac, ale co ma pisanie biblioteki dll wspolnego z
    assemblerem?

    --
    Michal Schulz


  13. #13
    MrokU
    Guest

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

    Właściwie to poza tym, że biblioteka ma być napisana w ASMie, to
    nic :)

    PS. Spojrzał już ktoś może na te errory/ Bo kurde nie umiem sobie z
    tym poradzić...

    pozdr

  14. #14
    Remek
    Guest

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

    Użytkownik "MrokU" napisał:

    > Spojrzał już ktoś może na te errory/ Bo kurde nie
    > umiem sobie z tym poradzić...


    Nie używam VC, więc wyodrębniłem kod DLL-ki do MrokU.asm :)

    Skompilowało się po usunięciu jednego błędu:

    sinus PROC katQ

    Masm32 akurat nie rozumie tej deklaracji. Musiałem podać:

    sinus PROC kat:QWORD

    ale wówczas nie zgadza mu się linia:

    mov eax, kat

    ze względu na niezgodność rozmiarów operandów. Masm nie umie rzutować tak
    jak HL-e. Dałem więc:

    sinus PROC katWORD

    I teraz działa. Można również tak:


    sinus PROC kat:QWORD

    ...

    mov eax, dword ptr kat

    Zależy co ma być wykorzystane. W tym przypadku do eax zostanie zapisany
    "górny" dword. Nie analizoeałem szczegółowo tej procedurki, więc nie wiem
    czy to wystarczy. Analizować "w locie" potrafi Bogdan.

    Remek










  15. #15
    MrokU
    Guest

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

    No MASMem też to kompilowałem i nie miał problemów...

    Tylko to zasrane VS mi się rzuca nie wiadomo o co... Więc to chyba nie
    jest kwestia samej składni, tylko środowiska...

    W czym jeszcze można robić tego typu projekty? W sensie C++ z ASMem,
    żeby się normalnie debugować dało i kompilować jako jeden projekt?

    pozdrawiam

  16. #16
    Bogdan (bogdro)
    Guest

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

    MrokU pisze:
    >> 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.

    >
    > No właśnie muszę używać, bo Visual mi się pluje, że coś robię nie tak
    > z rejestrem ESI. Nie wiem o co chodzi, ale jak te instrukcje dodam, to
    > żadnych błędów mi nie wyrzuca...


    Aha. No skoro tak, to nie ruszaj. Bo właśnie EBX, EBP, ESI i EDI nie
    wolno ruszać (chyba że zachowa się i przywróci poprzednią wartość).

    >> Swoją drogą, chyba "wynik" jest od tego, by otrzymać wynik, a nie "kat"?

    >
    > o FINIT nie wiedziałem. Jak na razie to jedyna funkcja, która używa
    > liczb zmiennoprzecinkowych, ale domyślnie będzie to działało tak, że
    > jedna duża funkcja będzie liczyła interpolację dla danego punktu, w
    > związku z tym FINIT będzie tylko raz (aczkolwiek to na razie plany).
    > Wynik jest do tego, żeby sobie spróbować zwrócić wynik w inny sposób
    > niż przez eax, ale jak na razie tego nie robiłem, bo nie do końca wiem
    > jak :P chociaż pewnie trzeba przekazać wskaźnik i modyfikować adres.
    > Tylko nie zastanawiałem się jeszcze jak to robić.


    Jeśli "wynik" to adres zmiennej, to ładujesz go do rejestru, np. EAX,
    po czym wynik z FPU ładujesz do [EAX].

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

    >
    > nie widziałem sensu dołączania całej biblioteki, skoro potrzebuję
    > tylko PI (chociaż jak już mówiłem, to są dopiero próby i przymierzanie
    > się do pisania programu).


    To nie jest dołączanie biblioteki w sensie binarnym (chyba że
    środowisko/linker jest naprawdę tępy). To jest dołączanie pliku
    nagłówkowego, a biblioteka fizycznie powinna zostać dołączona do
    programu tylko jak są wywoływane z niej jakiekolwiek funkcje.

    > No a z liczeniem sinusa 30 stopni, to nie ma sensu robić to z #define,
    > bo nie będę liczył stałych wartości kątów. Wszystko leci na wzorach i
    > będzie wyliczane na bieżąco.


    OK, to była tylko porada w razie czego.

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

  17. #17
    Bogdan (bogdro)
    Guest

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

    MrokU pisze:
    > A czy wiecie może, co może być skutkiem nagłej zmiany w Windowsach i
    > wysypu błędów?
    >
    > Bo w pewnym momencie coś się VS odwidziało i kod, który się normalnie
    > kompilował, nagle wyrzuca coś takiego (dla pewności kompilowany kod):


    [...]

    > KOMPILACJA:
    > 1>------ Rebuild All started: Project: interJA, Configuration: Debug
    > Win32 ------
    > 1>Deleting intermediate and output files for project 'interJA',
    > configuration 'Debug|Win32'
    > 2>------ Rebuild All started: Project: DLLint, Configuration: Debug
    > Win32 ------
    > 2>Deleting intermediate and output files for project 'DLLint',
    > configuration 'Debug|Win32'
    > 2>Assembling...
    > 1>Compiling...
    > 1>main.cpp
    > 2> Assembling: .\DLLint.asm
    > 2>.\DLLint.asm(1) : error A2044: invalid character in file
    > 2>.\DLLint.asm(2) : error A2008: syntax error : .
    > 2>.\DLLint.asm(4) : error A2008: syntax error : .
    > 2>.\DLLint.asm(6) : error A2008: syntax error : P
    > 2>.\DLLint.asm(8) : error A2109: only white space or comment can
    > follow backslash
    > 2>.\DLLint.asm(10) : error A2109: only white space or comment can
    > follow backslash
    > 2>.\DLLint.asm(12) : error A2109: only white space or comment can
    > follow backslash
    > 2>.\DLLint.asm(14) : error A2109: only white space or comment can
    > follow backslash
    > 2>.\DLLint.asm(16) : error A2109: only white space or comment can
    > follow backslash


    Wygląda, jakby nie tego narzędzia używał, choć niby pisze
    "assembling". Cokolwiek zmieniłeś w opcjach projektu, cofnij to :)
    Sprawdź, czy kompiluje tym, co trzeba (nie wiem jak, nie pytaj - może
    wystarczy gdzieś włączyć opcję pokazującą wykonywane komendy).
    Sprawdź, czy opcje są dobre. Sprawdź, czy rozszerzenie jest dobre (w
    niektórych kompilatorach na przykład ".c" a ".C" robi różnicę). Bo
    wyglądałoby na to, że parsuje ten plik preprocesorem C, czego nie
    powinien robić.

    > 2>Build log was saved at "file://c:\Documents and Settings\Ala\Desktop
    > \interJA\DLLint\Debug\BuildLog.htm"
    > 2>DLLint - 44 error(s), 0 warning(s)


    Sprawdź, co napisał w tym pliku.

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

  18. #18
    Remek
    Guest

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

    Użytkownik "MrokU" napisał:

    > No MASMem też to kompilowałem i nie miał problemów


    Taki kod jaki podałeś? I nie zgłosił błędów? Próbowałeś uzyc tej DLLki w
    jakims programie zrobionym w HLu?


    > W czym jeszcze można robić tego typu projekty? W sensie C++ z ASMem,
    > żeby się normalnie debugować dało i kompilować jako jeden projekt?


    Moim zdaniem normalne to jest robienie DLLi jako samodzielnych projektów.
    Przecież mają służyć wielu innym programom. No i jak asembler, to asembler,
    a nie HL. Nie jestem mocny w językach wyższego poziomu, ale wydaje mi się,
    że do kompilacji wstawek asemblerowych używają osobnych narzędzi np.
    produkty Borlana - Tama, MS - Masma. Niektóre umożliwiają wybór z wielu
    dostępnych (trzeba je wtedy doinstalować oddzielnie). I co to znaczy
    "normalnie debugować"?

    Remek






  19. #19
    MrokU
    Guest

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

    W tym logu nie napisał nic ciekawego, to co wkleiłem plus informacje,
    że linkuje i jakie programy do tego odpala...
    Ale.
    Już wszystko działa, nie wiem czemu nagle mu się odwidziało...

    > Taki kod jaki podałeś? I nie zgłosił błędów? Próbowałeś uzyc tej DLLki w
    > jakims programie zrobionym w HLu?


    Nie no zgłosił błędy, ale po poprawieniu składni wszystko się
    skompilowało.
    DLLki używam w programie w C++. VS ma na tyle fajną możliwość, że
    możesz w jednym projekcie mieć 2 podprojekty - jeden z HL i jeden jako
    DLL w ASMie.

    > Moim zdaniem normalne to jest robienie DLLi jako samodzielnych projektów.
    > Przecież mają służyć wielu innym programom. No i jak asembler, to asembler,
    > a nie HL. Nie jestem mocny w językach wyższego poziomu, ale wydaje misię,
    > że do kompilacji wstawek asemblerowych używają osobnych narzędzi np.
    > produkty Borlana - Tama, MS - Masma. Niektóre umożliwiają wybór zwielu
    > dostępnych (trzeba je wtedy doinstalować oddzielnie). I co to znaczy
    > "normalnie debugować"?


    No właśnie to jest DLLka, którą piszę na projekt na zaliczenie i ona
    domyślnie służy do tego, żeby nauczyć się robić takie rzeczy i jest
    dedykowana dla tego jednego programu. Zresztą jak będzie działać z
    jednym, to z resztą również.

    I nie chodzi tutaj o żadne wstawki, tylko o normalnego ASMa.

    Normalnie debugować... Chodziło mi o to, że jestem w stanie w jednym
    środowisku prześledzić kod w C++, przeskoczyć do DLL, prześledzić
    rejestry i wrócić z powrotem do głównego programu.



    No i teraz kolejne pytanie:
    mam napisać funkcję, która wywoływana jest rekurencyjnie i zwraca
    wartość double.
    Na razie zwracałem wartości zmiennoprzecinkowe tylko wpisując wynik
    pod adres podany jako zmienna wejściowa (tak jak napisał Bogdan).
    Generalnie wyliczać mam taki wzorek:

    U(k) = f(x) + 2 * U(k+1) * cos(B) - U(k+2)

    zresztą mniejsza o to, możecie podpowiedzieć, jak zrobić takie
    wywołanie rekurencyjne i zwrócenie wartości double przez funkcję?

    pozdrawiam

  20. #20
    MrokU
    Guest

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

    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 nWORD, kWORD, beta:PTR, tab:PTR
    LOCAL t1:QWORD, t2:QWORD, t3:QWORD, t4:QWORD, tempWORD, 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

Strona 1 z 2
1 2 OstatniOstatni

Thread Information

Users Browsing this Thread

Aktualnie 1 użytkownik(ów) przegląda ten temat. (0 zarejestrowany(ch) oraz 1 gości)

     

Podobne wątki

  1. VC Command Prompt
    By Marcin 'Malcom' Malich in forum pl.comp.lang.*
    Odpowiedzi: 4
    Ostatni post / autor: 05-31-2009, 17:59
  2. Czas kompilacji - Visual C++ 9.0 oraz flaga /MP
    By Mateusz Loskot in forum pl.comp.lang.*
    Odpowiedzi: 2
    Ostatni post / autor: 05-31-2009, 17:57
  3. string w c++ Visual Studio na konsole
    By fox555 in forum pl.comp.lang.*
    Odpowiedzi: 60
    Ostatni post / autor: 05-31-2009, 17:57
  4. Odpowiedzi: 1
    Ostatni post / autor: 05-31-2009, 17:52
  5. Visual Studio 2005 - przelaczenie widoku
    By Grzegorz in forum pl.comp.lang.*
    Odpowiedzi: 0
    Ostatni post / autor: 05-31-2009, 17:43

Wejścia z wyszukiwarek:

a tool returned an error code from Assembling

sinus 30 stopni c

visual studio 2008 link dll

Visual Studio 2008 C gdzie funkcje

dll visual studi 2008

wczytanie dll visual studio

dll visual studio 2008

goertzel cpp

visual studio 2008 c kurs

Tagi dla tego tematu

Uprawnienia

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów


Afrikaans Albanian Arabic Belarusian Bulgarian Catalan Chinese Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician German Greek Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Taiwanese Thai Turkish Ukrainian Vietnamese Welsh Yiddish