[elektro] xc16 optimalizáció mizéria

elight elight at gmail.hu
Fri Jun 23 13:57:11 CEST 2017


:-)


Küldöm a programokat, kérem a jelszót! ;-)




Ja, rájöttem:  "1234" :-D

Üdv István


2017-06-23 13:54 keltezéssel, Bánhidi István írta:
> Eeez igen Feri,
>
> Gratula a szép levezetéshez!
>
> Egyben már gyerekkoromban is sejtettem, de felnőtté válásom óta már tudom,
> hogy aki a mai világban asm-ezik az tuti mazochista vagy elmebeteg!
> Mivel proc-ról van szó, mindig lehet találni egy nagyobb teljesítményű
> példányt, ezért én tuti megmaradok a C-nél.
>
> A fentieket KÉREM senki NE vegye magára!
> De részemről asm-ezzen az, akinek két anyja van!
>
> Egyébként meg full respect az asm guruknak!
>
> Megj.: Az asm-ről még annyit, hogy csak akkor olvasom (és csakis) PC-n,
> amikor épp reverse engineeringet játszok egy programon egy jelszóért,
> sorozatszámért stb ;)
>
> Steve
>
>
> 2017. június 23. 13:22 Ferenc Wágner írta, <wferi at niif.hu>:
>
>> Balla Zoltán <sdrlab at yandex.ru> writes:
>>
>>> 2017.06.23. 10:12 keltezéssel, Ferenc Wágner írta:
>>>
>>>> Balla Zoltán <sdrlab at yandex.ru> writes:
>>>>
>>>>> void  __attribute__ ((section("my_other"))) FlashRead (u32 Cim, u8
>>>>> *Puffer, u16 Hossz)
>>>>> {
>>>>>      u16 temp=Cim;
>>>>>      u8      i,i1;
>>>>>      TBLPAG=Cim >> 16;
>>>>>      asm ("mov %0, W6": "+g"(temp));
>>>> Bocs, ha hülyeséget írok, most néztem meg az asm és a PIC doksit is.
>>>>
>>>> Most itt a %0 (vagyis a temp) kimenet vagy bemenet?  Mert a szokásos
>>>> sorrendezéssel a MOV forrása, de a kimeneti listában szerepelteted.
>>> Más a szintaktikája az inline assemblynek és a normálnak!
>> Pontosabban az asm kulcsszó különböző assembly dialektusokat is támogat.
>> Alapvetően én is azt javaslom, hogy kerüld el ezt az egész mizériát, és
>> használd a rendelkezésedre álló C makrókat.  Ha viszont szeretnéd
>> megérteni, hogy pontosan mi okozza a jelenlegi problémát, akkor hajrá!
>>
>> Az optimalizáció nélküli kódról ezt írtad:
>>
>> !    u16 temp=Cim;
>> 0x15642: MOV [W14+4], W1
>> 0x15644: MOV W1, [W14+2]
>>
>> Ebből szerintem világos, hogy a W14+4 a Cim változód címe, a W14+2 a
>> temp változódé, és az adatmozgás balról jobbra történik a fenti
>> listában.  Később:
>>
>> !    asm ("mov %0, W6": "+g"(temp));
>> 0x15650: MOV [W14+2], W8
>> 0x15652: MOV W8, W6
>> 0x15654: MOV W8, [W14+2]
>>
>> Ebből megtudjuk, hogy a %0 helyére W8 került, és az asm kulcsszó utáni
>> assembly szintaxisban is balról jobbra mozognak az adatok.
>>
>>> A %0 ha jól emlékszem a temp változó típusát adja csak meg,
>> Nem, a %0 a temp változó automatikusan generált szimbolikus neve.
>> https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#OutputOperands
>>
>>> természetesen bemeneti listaban van a temp!
>> A https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html szerint:
>>
>> asm [volatile] ( AssemblerTemplate
>>                   : OutputOperands
>>                   [ : InputOperands
>>                   [ : Clobbers ] ])
>>
>> Esetedben az AssemblerTemplate "mov %0, W6", az OutputOperands pedig
>> "+g"(temp), vagyis a kimeneti listában van a temp.  De a + jel miatt a
>> %0 olvasásra *is* használható.
>>
>> És azért generálja a fordító a MOV W8, [W14+2] utasítást, mert nem
>> értelmezi az AssemblerTemplate-et, tehát nem tudja, hogy az
>> megváltoztatta-e a %0 (a adott esetben W8) értékét.  Tehát mivel a %0
>> kimenet, ezért visszaírja a temp változóba.
>>
>>>> Ettől függetlenül a W6-ot nem használhatod a fordító háta mögött.
>>> Nem is teszem azt! A fordító látja, melyik regisztert használom, és ha
>>> az általa már érintett valahol, akkor automatikusan menti azt...
>> Nem látja (lásd fent), és ennek folytán nem is menti, hacsak nem jelzed
>> külön: https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Clobbers.
>> --
>> Feri
>>
>> -----------------------------------------
>>            elektro[-flame|-etc]
>>
> -----------------------------------------
>            elektro[-flame|-etc]



More information about the Elektro mailing list