[elektro] C kérdés

Papp Zoltán zombi at c2.hu
Thu Sep 24 12:29:22 CEST 2009


2009.09.23. 16:00:32 dátumon potyo <potyo.ada at gmail.com> írta:

> Néhány példa a listing fájlból különféle próbálkozásokra (minden
> optimalizálás be van kapcsolva)
>
> 144:                       if (address&(1<<10)) EE_A10_IO=1; else
> EE_A10_IO=0;
>  00078    010F     MOVLB 0xf
>  0007A    5121     MOVF 0x21, W, BANKED
>  0007C    0B00     ANDLW 0
>  0007E    E002     BZ 0x84
>  00080    8090     BSF LATH, 0, ACCESS
>  00082    D001     BRA 0x86
>  00084    9090     BCF LATH, 0, ACCESS
>
> 145:                       if (*((unsigned
> char*)((&address)+1))&(1<<(10-8))) EE_A10_IO=1; else EE_A10_IO=0;
>  00086    010F     MOVLB 0xf
>  00088    A523     BTFSS 0x23, 0x2, BANKED
>  0008A    D002     BRA 0x90
>  0008C    8090     BSF LATH, 0, ACCESS
>  0008E    D001     BRA 0x92
>  00090    9090     BCF LATH, 0, ACCESS
>
> 146:                       address&(1<<10)?(EE_A10_IO=1):(EE_A10_IO=0);
>  000A0    010F     MOVLB 0xf
>  000A2    5121     MOVF 0x21, W, BANKED
>  000A4    0B00     ANDLW 0
>  000A6    E003     BZ 0xae
>  000A8    8090     BSF LATH, 0, ACCESS
>  000AA    0E01     MOVLW 0x1
>  000AC    D002     BRA 0xb2
>  000AE    9090     BCF LATH, 0, ACCESS
>  000B0    0E00     MOVLW 0
>
> 147:                       EE_A10_IO=((address&(1<<10))==(1<<10));
>  000B2    010F     MOVLB 0xf
>  000B4    5121     MOVF 0x21, W, BANKED
>  000B6    0B00     ANDLW 0
>  000B8    E002     BZ 0xbe
>  000BA    0E00     MOVLW 0
>  000BC    D001     BRA 0xc0
>  000BE    0E01     MOVLW 0x1
>  000C0    B0E8     BTFSC WREG, 0, ACCESS
>  000C2    8090     BSF LATH, 0, ACCESS
>  000C4    A0E8     BTFSS WREG, 0, ACCESS
>  000C6    9090     BCF LATH, 0, ACCESS
>
> Tehát mint látható, a castolásos módszer adja a legkisebb kódot. Az első
> kettő sem rossz, de van egy felesleges ANDLW művelet benne. Szimulátorral
> kimértem a végrehajtási időket, sorban 6,5,7,11 utasításciklus kell nekik
> (ugyan itt még hibás a castolás, de ebből a szemponból nem lényeges)
> -----------------------------------------
>           elektro[-flame|-etc]

Szia!

Arra mit ad, hogy:

EE_A10_IO=((address&(1<<10))>>10; ?

Én mondjuk csak IAR C for AVR alatt próbálkoztam, azaz AVR maggal, de ott nekem ezt mindenféle optimalizálás nélkül is kb. olyasmire fordítja mint neked a 2. versenyzőt.
Azaz egyből vágja, hogy csak egy bájttal kell foglalkozni a 2 bájtos változóból, ezt elméletileg egy 8-bites magra írt fordítónak illene tudnia. úgy látszik ez nem tudja :(

Üdv
-- 
Papp Zoltán
OneWay Electronics Kft
Hangszerviz
szkájp: oneway[aláhúzás]papp[aláhúzás]zoltan



More information about the Elektro mailing list