wskaznik do funkcji
Masz problem? Zapytaj na forum elektroda.pl
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: wskaznik do funkcji
Date: Wed, 16 Mar 2005 00:04:02 +0100
Witam
Pisze w Keil uVision3 prosty programik dla 89c2051 i oto co mnie wkurza lub
robie cos le :
zadeklarowalem :
typedef void (*WYN)(unsigned char*);
void Przelicz(unsigned char* nazwa){
//tu pusto poki co
}
void Oblicz(unsigned char adres,unsigned char* nap, WYN licz){
unsigned char bufor[5];
//tutaj zmienna adres = 0x80 czyli oki
licz(bufor);
//tutaj adres = 0. rowniez nap =0 .
}
main(){
.......
Oblicz(0x80,napis,Przelicz);
}
Pytanie sie pojawia czemu on zamazuje te dane podczas wykonywania niczego.
Sposob skoku do funkcji sie zmienia przy takim adresowaniu ale wedlug mnie
powinno byc oki. Chyba ze robie cos zle, a moge robic bo 1 raz takiego
adresowania uzywam.
dzieki za porady
ynio
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 11:21:10 +0100
Ponizej kompletny przyklad.
Tak jakby wywolujac funkcje "funckja(bufor)" on jakby zwalnial pamiec dla
funkcji "dzialaj";
Czy to jest normalne ???
ynio
typedef void (*WYN)(unsigned char*);
code unsigned char napis[]="dupa wolowa";
void Przelicz(unsigned char* nap){
}
void dzialaj(unsigned char adres,unsigned char* wysw,WYN funkcja){
unsigned char bufor[5];
//tu adres = 0x80
funkcja(bufor);
//tu juz adres = 0
adres= adres + 1;
}
main(){
while(1){
dzialaj(0x80,napis,Przelicz);
}
}
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 16 Mar 2005 12:15:32 +0100
On Wed, 16 Mar 2005 11:21:10 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl> wrote:
void dzialaj(unsigned char adres,unsigned char* wysw,WYN funkcja){
unsigned char bufor[5];
//tu adres = 0x80
funkcja(bufor);
//tu juz adres = 0
adres= adres + 1;
}
To jest zapisane poprawnie, ale nie ma żadnego sensu - "wysw" jest nieużywany,
"adres" tak naprawdę również jest nieużywany, "bufor" jest niezainicjalizowany,
a jak mniemam powinien (chociaż nie musi) być. Najprawdopodobniej kompilator
zauważył te niekonsekwencje i dokonał odpowiednich optymalizacji.
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 13:42:06 +0100
void dzialaj(unsigned char adres,unsigned char* wysw,WYN funkcja){
unsigned char bufor[5];
//tu adres = 0x80
funkcja(bufor);
//tu juz adres = 0
adres= adres + 1;
}
To jest zapisane poprawnie, ale nie ma żadnego sensu - "wysw" jest
nieużywany,
"adres" tak naprawdę również jest nieużywany, "bufor" jest
niezainicjalizowany,
a jak mniemam powinien (chociaż nie musi) być. Najprawdopodobniej
kompilator
zauważył te niekonsekwencje i dokonał odpowiednich optymalizacji.
No wlasnie w tym przypadku to tak.Ja to napisalem przykladowo zeby nie
zaczerniac przykladu. W normlanym programie wszystko jest uzywane, a mimo to
zmienne sa zerowane, naotmiast jesli wywolam funkcje jawnie to wszystko w
porzadku
Sprawdze innym kompilatorem.
ynio
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 14:25:28 +0100
On 16 Mar 2005 12:15:32 +0100, Jan Dubiec wrote:
To jest zapisane poprawnie,
Tez mi sie tak wydaje.
ale nie ma żadnego sensu - "wysw" jest nieużywany,
"adres" tak naprawdę również jest nieużywany, "bufor" jest niezainicjalizowany,
a jak mniemam powinien (chociaż nie musi) być. Najprawdopodobniej kompilator
zauważył te niekonsekwencje i dokonał odpowiednich optymalizacji.
Nie bardzo mial prawo - musialby bardzo globalnie patrzec zeby moc to
zrobic. A przy takim zapisie to skad ma wiedziec ze mniejszy fragment
nic nie robi ?
Podeslij wydruk assemblerowy tego przykladu, moze dodajac
putc(bufor[0]) przed i po wywolaniu [printf bedzie za dlugi].
Moze wtedy cos zobaczymy podejrzanego.
Moze blad w kompilatorze, moze trzeba mu dorzucic jakies slowa
kluczowe ?
J.
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 14:40:59 +0100
Tez mi sie tak wydaje.
ale nie ma żadnego sensu - "wysw" jest nieużywany,
"adres" tak naprawdę również jest nieużywany, "bufor" jest
niezainicjalizowany,
a jak mniemam powinien (chociaż nie musi) być. Najprawdopodobniej
kompilator
zauważył te niekonsekwencje i dokonał odpowiednich optymalizacji.
Nie bardzo mial prawo - musialby bardzo globalnie patrzec zeby moc to
zrobic. A przy takim zapisie to skad ma wiedziec ze mniejszy fragment
nic nie robi ?
Podeslij wydruk assemblerowy tego przykladu, moze dodajac
putc(bufor[0]) przed i po wywolaniu [printf bedzie za dlugi].
Moze wtedy cos zobaczymy podejrzanego.
Moze blad w kompilatorze, moze trzeba mu dorzucic jakies slowa
kluczowe ?
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
#pragma ot(1,size)
funkcja // ktora sporo dziala
#pragma ot(9,size)
I co ciekawe program troche zwiekszyl objetosc ale wszystko gra i huczy. :)
Co o tym sadzicie ?
ynio
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 16:04:44 +0100
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
Ale tego nie powinien bardzo optymalizowac ..
J.
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 16 Mar 2005 17:30:32 +0100
On Wed, 16 Mar 2005 16:04:44 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
Ale tego nie powinien bardzo optymalizowac ..
IMO jak najbardziej powinien. Np. wyrażenie adres = adres + 1; umieszczone na
końcu funkcji nie ma żadnego skutku (przy deklaracji zmiennej adres takiej
jak w przykładzie). Więc nadaje się do wywalenia, tzn. optymalizacji. :-)
Dobry kompilator, czyli gcc, :-) przy optymalizacji O3 wogóle wywali wywołanie
funkcji działaj i z main-a od razu zawoła funkcję Przelicz.
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 18:37:35 +0100
On 16 Mar 2005 17:30:32 +0100, Jan Dubiec wrote:
On Wed, 16 Mar 2005 16:04:44 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
Ale tego nie powinien bardzo optymalizowac ..
IMO jak najbardziej powinien. Np. wyrażenie adres = adres + 1; umieszczone na
końcu funkcji nie ma żadnego skutku (przy deklaracji zmiennej adres takiej
jak w przykładzie). Więc nadaje się do wywalenia, tzn. optymalizacji. :-)
Dobry kompilator, czyli gcc, :-) przy optymalizacji O3 wogóle wywali wywołanie
funkcji działaj i z main-a od razu zawoła funkcję Przelicz.
No wlasnie nie.
Pusta funkcje Przelicz moze zamienic na jednego ret.
adres++ moze wywalic, ale funkcja(bufor) juz nie - bo nie wie co jest
w zmiennej "funkcja". Tzn moglby wiedziec, ale to juz by chyba za duzo
optymalizacji bylo :-)
Owszem, moglby w ogole parametr "adres" potraktowac jako przestrzen
robocza bo nieuzywany ... ale skoro ynio stwierdzil ze sie zmienia ..
to chyba jednak uzyl.
No chyba ze ynio stwierdzil to debuggerem, a kompilator przydzielil
tej zmiennej rejestr i skoro nie uzywana to nie uznal za sensowne
zachowywac na czas wywolania *funkcja.
Stanowczo trzeba zajrzec w assemblerka.
J.
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 18:56:14 +0100
No chyba ze ynio stwierdzil to debuggerem, a kompilator przydzielil
tej zmiennej rejestr i skoro nie uzywana to nie uznal za sensowne
zachowywac na czas wywolania *funkcja.
Stanowczo trzeba zajrzec w assemblerka.
Analizowalem sobie znowu i faktycznie gdy cos sie robi ze zmienna to
przetrzymuje.
Ale w moim przypadku tez robilem, adres bezposrednio przekazywalem do innej
funkcji, tak samo jak adresy do buforow.
No nic powstal ciekawy temat:)
W razie gdy cos nie dziala nalezy wylaczyc optymalizacje i zobaczyc czy to
nie taka przyczyna :)
Pozdrawiam
ynio
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 17 Mar 2005 10:02:49 +0100
On Wed, 16 Mar 2005 18:37:35 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
On 16 Mar 2005 17:30:32 +0100, Jan Dubiec wrote:
On Wed, 16 Mar 2005 16:04:44 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
Ale tego nie powinien bardzo optymalizowac ..
IMO jak najbardziej powinien. Np. wyrażenie adres = adres + 1; umieszczone na
końcu funkcji nie ma żadnego skutku (przy deklaracji zmiennej adres takiej
jak w przykładzie). Więc nadaje się do wywalenia, tzn. optymalizacji. :-)
Dobry kompilator, czyli gcc, :-) przy optymalizacji O3 wogóle wywali wywołanie
funkcji działaj i z main-a od razu zawoła funkcję Przelicz.
No wlasnie nie.
Pusta funkcje Przelicz moze zamienic na jednego ret.
adres++ moze wywalic, ale funkcja(bufor) juz nie - bo nie wie co jest
w zmiennej "funkcja".
No i kompilator (gcc -O3) robi to sprytnie - generuje poprawne i zoptymalizowane
ciało funkcji działaj() (bo być może będzie ona wołana z innego modułu programu),
ale w main-ie woła od razu Przelicz(). Nie sprawdzałem tego, ale wydaje się być
całkiem naturalne, że gdyby działaj() było zadeklarowane z modyfikatorem static,
to kompilator nie wygenerowałby kodu dla tej funkcji.
Tzn moglby wiedziec, ale to juz by chyba za duzo optymalizacji bylo :-)
Gcc 3.4.0 dla ix86 z właczonš optymalizacjš O2 lub mniejszš tego nie wie,
ale z O3 już wie. :-)
Owszem, moglby w ogole parametr "adres" potraktowac jako przestrzen
robocza bo nieuzywany ... ale skoro ynio stwierdzil ze sie zmienia ..
to chyba jednak uzyl.
No właśnie zmnienia się dlatego, że najprawdopodobniej miejsce przez
które została przekazana wartość adres (czyli, w zależności od
calling convention, rejestr lub komórka pamięci na stosie) zostało
użyte jako owa "przstrzeń robocza", a konkretnie jako miejsce przez
które przekazuje się z kolei argument do funkcji funkcja(), czyli po
prostu wskanik (adres) tablicy char-ów.
No chyba ze ynio stwierdzil to debuggerem, a kompilator przydzielil
tej zmiennej rejestr i skoro nie uzywana to nie uznal za sensowne
zachowywac na czas wywolania *funkcja.
Ja to jestem praktycznie pewny, że stwierdził to na podstawie wskazań
symulatora/debuggera. :-)
Stanowczo trzeba zajrzec w assemblerka.
Oczywiście. Tak też zrobiłem, aczkolwiek dla ix86. :-)
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 17:00:00 +0100
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
#pragma ot(1,size)
funkcja // ktora sporo dziala
#pragma ot(9,size)
I co ciekawe program troche zwiekszyl objetosc ale wszystko gra i huczy. :)
Co o tym sadzicie ?
A tak apropos - moze to nie problem z wywolywaniem funkcji, tylko
w tej Przelicz wychodziles poza zakres bufora ?
J.
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 17:34:03 +0100
Uzytkownik "J.F." <jfox_xnospamx_at_nospam_poczta.onet.pl> napisal w wiadomosci
news:gslg315nu1nqcs3gepjq5tkdl90ji0fhff_at_nospam_4ax.com...
On Wed, 16 Mar 2005 14:40:59 +0100, ynio wrote:
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po
funkcji
#pragma ot(1,size)
funkcja // ktora sporo dziala
#pragma ot(9,size)
I co ciekawe program troche zwiekszyl objetosc ale wszystko gra i huczy.
)
Co o tym sadzicie ?
A tak apropos - moze to nie problem z wywolywaniem funkcji, tylko
w tej Przelicz wychodziles poza zakres bufora ?
J.
No wlasnie nie, specjalnie dawalem spory buforek.
No nic w razie to taki manewr pomaga.
W koncu i tak to rozwiazalem wszystko nie uzywajac wskaznikow do funkcji.
Teraz ladnie smiga i nie trzeba zmniejszac optym.
Pozdr
ynio
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 16 Mar 2005 17:16:25 +0100
On Wed, 16 Mar 2005 14:40:59 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl> wrote:
[.....]
Skubany kompilator optymalizowal. Dalem dyrektywy przed funkcja i po funkcji
#pragma ot(1,size)
funkcja // ktora sporo dziala
#pragma ot(9,size)
I co ciekawe program troche zwiekszyl objetosc ale wszystko gra i huczy. :)
Co o tym sadzicie ?
Sšdzimy że to normalka. Ale skoro kompilator zoptymalizował kawałek
kodu czego wg. Ciebie nie powinien był robić, to jest prawie pewne, że
ów kawałek kodu jest do bani. Nie wiem czego konkretnie oczekujesz, ale
jeśli chcesz aby kompilator za bardzo nie przesadzał z optymalizacjš,
to możesz używać modyfikatora "volatile" do deklaracji niektórych zmiennych.
IMO daje lepszš kontrolę nad kodem niż nieprzenośne pragmy czy też opcje
kompilatora.
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Wed, 16 Mar 2005 19:02:36 +0100
I co ciekawe program troche zwiekszyl objetosc ale wszystko gra i huczy.
)
Co o tym sadzicie ?
Sšdzimy że to normalka. Ale skoro kompilator zoptymalizował kawałek
kodu czego wg. Ciebie nie powinien był robić, to jest prawie pewne, że
ów kawałek kodu jest do bani. Nie wiem czego konkretnie oczekujesz, ale
jeśli chcesz aby kompilator za bardzo nie przesadzał z optymalizacjš,
to możesz używać modyfikatora "volatile" do deklaracji niektórych
zmiennych.
IMO daje lepszš kontrolę nad kodem niż nieprzenośne pragmy czy też opcje
kompilatora.
Dzieki, bede sie staral. Prawdopodobnie cos gdzies chrzanilem, teraz juz to
przerobilem zupelnie inaczej i jest git.
Nie bede tu sie bronil ale w c pod 8051 zaczalem od tygodnia :) kiedys sporo
w asemblerze.
A z innej beczki mam takie wyrazenie :
(3600*z) / x.
Z tego x przyjmuje wartosci 1-200. Chodzi oto ze zrobilem to w taki sposob:
x i z to unsigned int.
z = [0,132]
unsigned long temp;
temp = 3600* (unsigned long)z;
temp = temp/x;
Wszystko dziala, tylko to cholernie nie optymalny kawalek, bo zajmuje sporo
i wykonuje sie ok 100us przy 12MHz.
Czy znacie jakies sztuczki na takie operacje?
wiem ze jakby bylo dzielenie przez potege dwójki to spoko, mozna przesuwac
bity.
dzieki
ynio
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 17 Mar 2005 09:31:08 +0100
On Wed, 16 Mar 2005 19:02:36 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl> wrote:
[.....]
A z innej beczki mam takie wyrazenie :
(3600*z) / x.
Z tego x przyjmuje wartosci 1-200. Chodzi oto ze zrobilem to w taki sposob:
x i z to unsigned int.
z = [0,132]
unsigned long temp;
temp = 3600* (unsigned long)z;
temp = temp/x;
Wszystko dziala, tylko to cholernie nie optymalny kawalek, bo zajmuje sporo
i wykonuje sie ok 100us przy 12MHz.
Czy znacie jakies sztuczki na takie operacje?
Jeśli to ma być szybkie, to sam zaimplementuj w assemblerze mnożenie i dzielenie
liczb wielobajtowych. Możesz też stablicowac wartość wyrażenia 3600*z (133
liczby czterobajtowe) albo nawet całego wyrażenia jeśli masz dużo pamięci
programu. Możesz też użyć taniego mikrokontrolera 32-bitowego i zapomnieć
o takich problemach. :-)
Regads,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Thu, 17 Mar 2005 11:30:18 +0100
Użytkownik "Jan Dubiec" <jdx_at_nospam_SPAMTRAP.slackware.pl> napisał w wiadomości
news:87k6o67jxv.fsf_at_nospam_hs001.slackware.pl...
On Wed, 16 Mar 2005 19:02:36 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
wrote:
[.....]
A z innej beczki mam takie wyrazenie :
(3600*z) / x.
Z tego x przyjmuje wartosci 1-200. Chodzi oto ze zrobilem to w taki
sposob:
x i z to unsigned int.
z = [0,132]
unsigned long temp;
temp = 3600* (unsigned long)z;
temp = temp/x;
Wszystko dziala, tylko to cholernie nie optymalny kawalek, bo zajmuje
sporo
i wykonuje sie ok 100us przy 12MHz.
Czy znacie jakies sztuczki na takie operacje?
Jeśli to ma być szybkie, to sam zaimplementuj w assemblerze mnożenie i
dzielenie
liczb wielobajtowych. Możesz też stablicowac wartość wyrażenia 3600*z (133
liczby czterobajtowe) albo nawet całego wyrażenia jeśli masz dużo pamięci
programu. Możesz też użyć taniego mikrokontrolera 32-bitowego i zapomnieć
o takich problemach. :-)
Haha :) 32 botowy procek, spoko. Na razie dzialam na malutkim 89c2051 i
niech sie meczy z dzieleniem:)
Tablica raczej nie wchodzi w gre, bo to dzielenie najdluzsze, 2kb pamieci
prawie wykorzystana, i dwie zmienne w dzialaniu :)
no nic dzieki sliczne
ynio
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Thu, 17 Mar 2005 22:58:12 +0100
On Thu, 17 Mar 2005 11:30:18 +0100, ynio wrote:
A z innej beczki mam takie wyrazenie :
(3600*z) / x.
Z tego x przyjmuje wartosci 1-200. Chodzi oto ze zrobilem to w taki
sposob:
z = [0,132]
[..]
Haha :) 32 botowy procek, spoko. Na razie dzialam na malutkim 89c2051 i
niech sie meczy z dzieleniem:)
Tablica raczej nie wchodzi w gre, bo to dzielenie najdluzsze, 2kb pamieci
prawie wykorzystana, i dwie zmienne w dzialaniu :)
Wstawka assemblerowa ? Mnozenie longa [eee - 24 bit starcza] przez 8
bit jest zgrabne, dzielenie przez 8 bit tez.
Hm .. a moze kompilator o tym wie ?
J.
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 18 Mar 2005 07:57:32 +0100
On Thu, 17 Mar 2005 22:58:12 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
[.....]
Wstawka assemblerowa ? Mnozenie longa [eee - 24 bit starcza] przez 8
bit jest zgrabne, dzielenie przez 8 bit tez.
Hm .. a moze kompilator o tym wie ?
Nie sšdzę. Dlatego sugerowałem napisanie własnych funkcji w assemblerze.
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Fri, 18 Mar 2005 12:01:12 +0100
Użytkownik "Jan Dubiec" <jdx_at_nospam_SPAMTRAP.slackware.pl> napisał w wiadomości
news:87sm2tcug3.fsf_at_nospam_hs001.slackware.pl...
On Thu, 17 Mar 2005 22:58:12 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
wrote:
[.....]
Wstawka assemblerowa ? Mnozenie longa [eee - 24 bit starcza] przez 8
bit jest zgrabne, dzielenie przez 8 bit tez.
Hm .. a moze kompilator o tym wie ?
Nie sšdzę. Dlatego sugerowałem napisanie własnych funkcji w assemblerze.
a jak sie azbarac do takiego dzielenia?
ynio
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 18 Mar 2005 12:28:41 +0100
On Fri, 18 Mar 2005 12:01:12 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl> wrote:
Użytkownik "Jan Dubiec" <jdx_at_nospam_SPAMTRAP.slackware.pl> napisał w wiadomości
news:87sm2tcug3.fsf_at_nospam_hs001.slackware.pl...
On Thu, 17 Mar 2005 22:58:12 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
wrote:
[.....]
Wstawka assemblerowa ? Mnozenie longa [eee - 24 bit starcza] przez 8
bit jest zgrabne, dzielenie przez 8 bit tez.
Hm .. a moze kompilator o tym wie ?
Nie sšdzę. Dlatego sugerowałem napisanie własnych funkcji w assemblerze.
a jak sie azbarac do takiego dzielenia?
Poszukać algorytmu w Sieci (np. russian peasant algorithm) lub jakiejś
ksišżce, np. w "Algorytmy + struktury danych = programy" Wirtha coś
tam jest. Pouczajšce może być samodzielne wymyślenie algorytmu takiego
dzielenia wykorzystujac mnożenie i dzielenie przez 2 (czyli przesuwanie
bitów).
Regards,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Fri, 18 Mar 2005 12:42:33 +0100
On 18 Mar 2005 12:28:41 +0100, Jan Dubiec wrote:
On Fri, 18 Mar 2005 12:01:12 +0100, "ynio" <graveASPAM_at_nospam_poczta.onet.pl> wrote:
On Thu, 17 Mar 2005 22:58:12 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
[.....]
Wstawka assemblerowa ? Mnozenie longa [eee - 24 bit starcza] przez 8
bit jest zgrabne, dzielenie przez 8 bit tez.
a jak sie azbarac do takiego dzielenia?
Poszukać algorytmu w Sieci (np. russian peasant algorithm) lub jakiejś
ksišżce, np. w "Algorytmy + struktury danych = programy" Wirtha coś
tam jest. Pouczajšce może być samodzielne wymyślenie algorytmu takiego
dzielenia wykorzystujac mnożenie i dzielenie przez 2 (czyli przesuwanie
bitów).
Ale tu nie ma takiej potrzeby - akurat '51 pieknie mnozy i dzieli
przez 8 bit. Trzeba tylko zastosowac przeniesienia na kolejne bajty .
J.
From: Jan Dubiec <jdx_at_nospam_SPAMTRAP.slackware.pl>
Subject: Re: wskaznik do funkcji
Date: 18 Mar 2005 14:37:02 +0100
On Fri, 18 Mar 2005 12:42:33 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
On 18 Mar 2005 12:28:41 +0100, Jan Dubiec wrote:
[.....]
Poszukać algorytmu w Sieci (np. russian peasant algorithm) lub jakiejś
ksišżce, np. w "Algorytmy + struktury danych = programy" Wirtha coś
tam jest. Pouczajšce może być samodzielne wymyślenie algorytmu takiego
dzielenia wykorzystujac mnożenie i dzielenie przez 2 (czyli przesuwanie
bitów).
Ale tu nie ma takiej potrzeby - akurat '51 pieknie mnozy i dzieli
przez 8 bit. Trzeba tylko zastosowac przeniesienia na kolejne bajty .
Nie pamiętam ile cykli zajmuje dzielenie w 51, ale nie jest wcale takie oczywiste
że dzielenie (liczby kilkubajtowej) przy użyciu dzielenia :-) bedzie szybsze
niż dzielenie z użyciem shift-ów i odejmowania.
Regrds,
/J.D.
--
Jan Dubiec We're all living in Amerika
jdx#slackware.pl Coca Cola
+48 506 790442 Sometimes war
Amerika by Rammstein
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Fri, 18 Mar 2005 16:41:51 +0100
Użytkownik "Jan Dubiec" <jdx_at_nospam_SPAMTRAP.slackware.pl> napisał w wiadomości
news:877jk5vzwh.fsf_at_nospam_hs001.slackware.pl...
On Fri, 18 Mar 2005 12:42:33 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
wrote:
On 18 Mar 2005 12:28:41 +0100, Jan Dubiec wrote:
[.....]
Poszukać algorytmu w Sieci (np. russian peasant algorithm) lub jakiejś
ksišżce, np. w "Algorytmy + struktury danych = programy" Wirtha coś
tam jest. Pouczajšce może być samodzielne wymyślenie algorytmu takiego
dzielenia wykorzystujac mnożenie i dzielenie przez 2 (czyli przesuwanie
bitów).
Ale tu nie ma takiej potrzeby - akurat '51 pieknie mnozy i dzieli
przez 8 bit. Trzeba tylko zastosowac przeniesienia na kolejne bajty .
Nie pamiętam ile cykli zajmuje dzielenie w 51, ale nie jest wcale takie
oczywiste
że dzielenie (liczby kilkubajtowej) przy użyciu dzielenia :-) bedzie
szybsze
niż dzielenie z użyciem shift-ów i odejmowania.
51 potrzebuje dwóch cykli do podzielenia 8bitowych.
Zaraz zaczynam sie bawic w jakis algorytmik :)
jak sie uda oczywyiscie napisze
ynio
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Fri, 18 Mar 2005 16:47:29 +0100
On 18 Mar 2005 14:37:02 +0100, Jan Dubiec wrote:
On Fri, 18 Mar 2005 12:42:33 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl> wrote:
Ale tu nie ma takiej potrzeby - akurat '51 pieknie mnozy i dzieli
przez 8 bit. Trzeba tylko zastosowac przeniesienia na kolejne bajty .
Nie pamiętam ile cykli zajmuje dzielenie w 51, ale nie jest wcale takie oczywiste
że dzielenie (liczby kilkubajtowej) przy użyciu dzielenia :-) bedzie szybsze
niż dzielenie z użyciem shift-ów i odejmowania.
IMHO - byloby szybsze.
Tylko ze pomylilem - zapomnialem ze to dzieli tylko 8b/8b - a nie 16/8
- czyli nie da sie uzyc :-(
Ale mnozy ladnie.
J.
From: "ynio" <graveASPAM_at_nospam_poczta.onet.pl>
Subject: Re: wskaznik do funkcji
Date: Sat, 19 Mar 2005 09:59:03 +0100
Użytkownik "J.F." <jfox_xnospamx_at_nospam_poczta.onet.pl> napisał w wiadomości
news:9rtl31hckgkqak6guustophenrahuh5cc1_at_nospam_4ax.com...
On 18 Mar 2005 14:37:02 +0100, Jan Dubiec wrote:
On Fri, 18 Mar 2005 12:42:33 +0100, J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
wrote:
Ale tu nie ma takiej potrzeby - akurat '51 pieknie mnozy i dzieli
przez 8 bit. Trzeba tylko zastosowac przeniesienia na kolejne bajty .
Nie pamiętam ile cykli zajmuje dzielenie w 51, ale nie jest wcale takie
oczywiste
że dzielenie (liczby kilkubajtowej) przy użyciu dzielenia :-) bedzie
szybsze
niż dzielenie z użyciem shift-ów i odejmowania.
IMHO - byloby szybsze.
Tylko ze pomylilem - zapomnialem ze to dzieli tylko 8b/8b - a nie 16/8
- czyli nie da sie uzyc :-(
Ale mnozy ladnie.
J.
Moze nie popisalem sie jakos super ale rozbilem dzielenie longa przez char,
na dwa dzielenia 16 bitowych i sumowanie. Analizujac wyszlo :
metoda dzielenie klasyczna typu long/long 1440 us,
moja 960 us
Przy czym rozbicie zaoszczedzilo ok 150-200 bajtow pamieci :)
Kiedys czytajac ksiazki o starych kompach, programowaniu optymalizacji zeby
jak najmniej kodu sie smialem, nie sadzilem ze bede robil to samo :)
Zeby tworcy gierek i innych tez tak podchodzili :)
Pozdr
ynio