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