C to ASM
Marek Pavlu
pavlu@hwg.cz
Sobota Srpen 13 21:11:52 CEST 2005
Zdravim,
Tak se to C naucte! Na Svete jsou slozitejsi věci, zvykejte si! Nebo by Vas
to zabilo?
UINT je pravdepodobne dva byty dlouhy celociselny typ(0-65535), ale to
zavisi u ANSI C na kompileru, ale když jde o pidi procesory, tak to bude
nejspis, jak rikam...
Takze mate takto dve promenne MixedDecayXOR a io, kde MixedDecayXOR je
nastaveno na zacatku na nulu...
ccw je asi smer, takze asi +1 a -1.
Osobne davam prednost nepouzivani zaporneho cisla, pokud nemusim.
Kompiler to ma pak jednodussi a asm je casto optimalizovanejsi.
// if(!ccw)
vykricnik je negace, takze bude-li ccw zaporne, pak
se vykona nasledujici blok
// {
// PhaseCount++;
// }
Je-li ccw kladne, pak ten druhy za else...
// PhaseCount++;
To je to same, jako by jste napsal:
PhaseCount = PhaseCount + 1;
S pouzitim -- pak je to odecteni jednicky.
Jednoduche jak facka, ze?
// MixedDecayXOR=0x820;
Pravdepodobne chapete, pripadne to znamena, ze do HighByte a LowByte teto
promenne(ma dva byty) date cislo 0x820(coz je to same jako 0x0820) takto:
HB: MixedDecayXOR=0x08
LB: MixedDecayXOR=0x20
// io=((sinus_tab[PhaseCount & 63]<<6 | sinus_tab[(PhaseCount+16) &
// 63]) ^ MixedDecayXOR);
Tohle se da rozlozit tak, ze to je lepe pochopitelne pro člověka, ale hure
optimalizovane kompilerem.
<< tohle je bitovy posun doleva, coz odpovida nasobeni 2 pro danou
promennou nebo cislo
| tohleto Vam provede bitovy OR pres vsechny bity promenych
& tohleto Vam provede bitovy AND pres vsechny bity promenych
^ tohleto Vam provede bitovy XOR pres vsechny bity promenych
Takze to lze rozepsat tak, ze budete mit ještě hafo dalsich promennych.
UINT io1,io2;
// nasledujici vezme PhaseCount, cislo 63 a provede bitovy AND
// vysledek do io1
io1 = PhaseCount & 63;
// nyní se vezme io1 a pouzije jako pozice v tabulce sinus_tab[io1]
// tim dostanete obsah tabulky na pozici dane obsahem io1
// vysledek do io1
io1 = sinus_tab[io1];
// pak se vezme io1 a bitove posune doleva o 6 bitu a ulozi do io1
io1 = io1 << 6;
// nasledujici vezme PhaseCount, cislo 16 a provede klasicky soucet
// vysledek do io2
io2 = PhaseCount + 16;
// nasledujici vezme io2, cislo 63 a provede bitovy AND
// vysledek do io2
io2 =io2 & 63;
// nyní se vezme io2 a pouzije jako pozice v tabulce sinus_tab[io2]
// tim dostanete obsah tabulky na pozici dene obsahem io2
// vysledek do io2
io2 = sinus_tab[io2];
//tim padem mame v io1 vyraz: sinus_tab[PhaseCount & 63]<<6
// a io2 vyraz: sinus_tab[(PhaseCount+16)&63]
// pokracuje
// do io dame bitovy soucet(bit po bitu) promennych io1 a io2
io = io1 | io2;
//tim padem mame v io vyraz:
//sinus_tab[PhaseCount & 63]<<6 | sinus_tab[(PhaseCount+16)&63]
// potrebujeme tedy jeste io bitove vyxorovat s obsahem MixedDecayXOR
io = io ^ MixedDecayXOR;
A je to! :).
V io mate to, co bylo zapsano mnohem kratseji a taky lepe pro kompiler, aby
mohl optimalizovat...
Pokud vim, tak pro x51 je uz moho let ANSI C zdarma!
Mimochodem, ta funkce není cela...
// -----Original Message-----
// From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On
// Behalf Of Milan MCM
// Sent: Saturday, August 13, 2005 11:22 AM
// To: HW-news
// Subject: Re: C to ASM
//
// Co se tyce volby CPU to bych neresil .
// Ale tomu zapisu v C nerozumim presneji nerozumim C a jim podobným :((
// operatory jako ! ++ --& << | ^ jsou pro mne velkou neznamou
//
// void step(char ccw)
// {
// UINT MixedDecayXOR=0, io;
//
// if(!ccw)
// {
// PhaseCount++;
// }
// else
// { //The "Mixed Decay" bits must be reversed when running in CCW
// direction
// PhaseCount--;
// MixedDecayXOR=0x820;
// }
//
// io=((sinus_tab[PhaseCount & 63]<<6 | sinus_tab[(PhaseCount+16) &
// 63]) ^ MixedDecayXOR);
//
//
//
// Možná by stačilo to popsat nějak slovně , jsem z toho volaky zmeteny o:))
// Ale ASM by mě pomohl asi více.
// Děkuji
// _______________________________________________
// HW-list mailing list - sponsored by www.HW.cz
// Hw-list@list.hw.cz
// http://list.hw.cz/mailman/listinfo/hw-list
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0532-6, 13/08/2005
Testovano: 13.8.2005 19:58:25
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0532-6, 13/08/2005
Testovano: 13.8.2005 20:27:17
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0532-6, 13/08/2005
Testovano: 13.8.2005 20:28:01
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com
---
avast! Antivirus: Odchozi zprava cista.
Virova databaze (VPS): 0532-6, 13/08/2005
Testovano: 13.8.2005 20:28:44
avast! (c) copyright 2000-2003 ALWIL Software.
http://www.avast.com
Další informace o konferenci Hw-list