eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingasm/c grrrrreat
Ilość wypowiedzi w tym wątku: 3

  • 1. Data: 2011-11-05 19:43:06
    Temat: asm/c grrrrreat
    Od: " fir" <f...@W...gazeta.pl>

    jestem zadowolony (pewnie do czasu az natkne sie na jakas
    przeszkode) bo udalo mi sie napisac proste add w sse
    i dziala, tylko mam pewne watpliwosci co do sposobu
    przekazywania parametrow

    ;implementacja "int __cdecl asm_add_float4vectors_sse(float4* a, float4* b,
    float4* ret);"

    asm_add_float4vectors_sse:

    enter 0,0

    mov eax,[ebp+8] ; first argument
    mov ebx,[ebp+12] ; second argument
    mov ecx,[ebp+16] ; third argument

    movups xmm0, [eax]
    movups xmm1, [ebx]
    addps xmm0, xmm1
    movups [ecx], xmm0

    leave
    ret

    czy powinno sie uzywac __cdecl - i czy to wogole jest poprawnie?


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 2. Data: 2011-11-06 08:53:00
    Temat: Re: asm/c grrrrreat
    Od: "Bogdan (bogdro)" <b...@p...gazeta.pl>

    W dniu 05.11.2011 20:43, fir pisze:
    > jestem zadowolony (pewnie do czasu az natkne sie na jakas
    > przeszkode) bo udalo mi sie napisac proste add w sse
    > i dziala, tylko mam pewne watpliwosci co do sposobu
    > przekazywania parametrow
    >
    > ;implementacja "int __cdecl asm_add_float4vectors_sse(float4* a, float4* b,
    > float4* ret);"
    >
    > asm_add_float4vectors_sse:
    >
    > enter 0,0
    >
    > mov eax,[ebp+8] ; first argument
    > mov ebx,[ebp+12] ; second argument
    > mov ecx,[ebp+16] ; third argument
    >
    > movups xmm0, [eax]
    > movups xmm1, [ebx]
    > addps xmm0, xmm1
    > movups [ecx], xmm0
    >
    > leave
    > ret
    >
    > czy powinno sie uzywac __cdecl - i czy to wogole jest poprawnie?

    Skoro używasz kompilatora C, to domyślnie konwencja wywołania jest
    dla języka C, więc nie trzeba pisać "__cdecl". Ale nie zaszkodzi.
    Co do kodu - funkcjonalnie wygląda poprawnie, ale może "nie dogadać"
    się z programem pisanym w C. Musisz zachować i przywrócić zawartość
    rejestru EBX lub skorzystać z takiego, który wolno zamazać, np. EDX.
    Poczytaj o konwencjach wywołań ("calling conventions").
    Pewnie dałoby się też wnętrze funkcji skompresować do 3 instrukcji:

    movups xmm0, [eax]
    addps xmm0, [ebx]
    movups [ecx], xmm0

    Ale to kwestia optymalizacji, a nie funkcjonalności.

    --
    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.Xiph.org www.TorProject.org Soft (EN): miniurl.pl/bogdro-soft


  • 3. Data: 2011-11-06 10:05:08
    Temat: Re: asm/c grrrrreat
    Od: " " <f...@N...gazeta.pl>

    Bogdan (bogdro) <b...@p...gazeta.pl> napisał(a):

    > W dniu 05.11.2011 20:43, fir pisze:
    > > jestem zadowolony (pewnie do czasu az natkne sie na jakas
    > > przeszkode) bo udalo mi sie napisac proste add w sse
    > > i dziala, tylko mam pewne watpliwosci co do sposobu
    > > przekazywania parametrow
    > >
    > > ;implementacja "int __cdecl asm_add_float4vectors_sse(float4* a, float4*
    b,
    > > float4* ret);"
    > >
    > > asm_add_float4vectors_sse:
    > >
    > > enter 0,0
    > >
    > > mov eax,[ebp+8] ; first argument
    > > mov ebx,[ebp+12] ; second argument
    > > mov ecx,[ebp+16] ; third argument
    > >
    > > movups xmm0, [eax]
    > > movups xmm1, [ebx]
    > > addps xmm0, xmm1
    > > movups [ecx], xmm0
    > >
    > > leave
    > > ret
    > >
    > > czy powinno sie uzywac __cdecl - i czy to wogole jest poprawnie?
    >
    > Skoro używasz kompilatora C, to domyślnie konwencja wywołania jest
    > dla języka C, więc nie trzeba pisać "__cdecl". Ale nie zaszkodzi.
    > Co do kodu - funkcjonalnie wygląda poprawnie, ale może "nie dogadać"
    > się z programem pisanym w C. Musisz zachować i przywrócić zawartość
    > rejestru EBX lub skorzystać z takiego, który wolno zamazać, np. EDX.
    > Poczytaj o konwencjach wywołań ("calling conventions").
    > Pewnie dałoby się też wnętrze funkcji skompresować do 3 instrukcji:
    >
    > movups xmm0, [eax]
    > addps xmm0, [ebx]
    > movups [ecx], xmm0
    >
    > Ale to kwestia optymalizacji, a nie funkcjonalności.
    >

    1. troche sie boje ze z tymi importami/exportami miedzy c.obj a asm.obj
    bede miec jakis problem (w c wiekszosc problemow mam rozwiazanych
    ale przy spotkaniach z asembler jest troche bardziej stresujaco);

    2. do tego nie wiem jaka konwencja wywolan bylaby najlepsza, nie kojarze
    do konca tych operacji na ebp itp (najlepszy bylby jakis
    dobrze okreslony fastcall ktory w [[eax], [[ebx], [[ecx], [edx]]]]
    przekazywal by wskazniki/inty (od 0 do 4rech do wyboru) bez
    ramek stosu wogole- cos w tym stylu - ale nie wiem czy po stronie
    c uda skonstruowac takie wywolania;

    3. do tego nie ma wcale w necie za duzo jakichs dobrych tutoriali
    do sse, wczoraj szukalem caly wieczor (np glownie jednej komendy ktora doda 4
    floaty z xxm do siebie - potrzebne do iloczynu skalarnego) i znalazlem
    jedynie fragmentaryczne info - jakis deficyt w tutorialach vel nie umiem
    znalezc - w sumie najpozyteczniejsza okazala sie stronka jednago
    z tutejszych grupowiczow (WM)






    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: