RE: C: co lze očekávat

Miroslav Draxal evik na volny.cz
Úterý Srpen 30 21:15:43 CEST 2016


char arrayB[3] @0x123;
char arrayA[3] ;

int main(void) {
    volatile char x = 0;
    volatile char a = 3;
    x--;
    if (a != arrayA[x + 1]) {
        if (a != arrayB[x + 1])
            __builtin_software_breakpoint();
    }
    return 0;


!int main(void) {
!    volatile char x = 0;
0xFFCA: CLRF x, ACCESS
!    volatile char a = 3;
0xFFCC: MOVLW 0x3
0xFFCE: MOVWF a, ACCESS
!    x--;
0xFFD0: DECF x, F, ACCESS
!    if (a != arrayA[x + 1]) {
0xFFD2: MOVF x, W, ACCESS
0xFFD4: ADDLW 0x2
0xFFD6: MOVWF FSR2, ACCESS
0xFFD8: CLRF FSR2H, ACCESS          /// arrayA @0x001, FSR2 = 0x001
0xFFDA: MOVF a, W, ACCESS
0xFFDC: XORWF POSTINC2, W, ACCESS
0xFFDE: BTFSC STATUS, 2, ACCESS
0xFFE0: GOTO 0x0
0xFFE2: NOP
!        if (a != arrayB[x + 1])
0xFFE4: MOVLW 0x24
0xFFE6: ADDWF x, W, ACCESS
0xFFE8: MOVWF FSR2, ACCESS
0xFFEA: CLRF FSR2H, ACCESS
0xFFEC: MOVLW 0x1
0xFFEE: ADDWFC FSR2H, F, ACCESS	/// arrayB @0x123, FSR2 = 0x223
0xFFF0: MOVF a, W, ACCESS
0xFFF2: XORWF POSTINC2, W, ACCESS
0xFFF4: BTFSC STATUS, 2, ACCESS
0xFFF6: GOTO 0x0
0xFFF8: NOP
!            __builtin_software_breakpoint();
!    }
!    return 0;
!}
0xFFFC: GOTO 0x0

-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Josef Štengl
Sent: Tuesday, August 30, 2016 11:44 AM
To: HW-news
Subject: Re: C: co lze očekávat

Ano, to by mohlo pomoci.

Neznám danou architekturu ale pokud je to load store architektura a umožňuje adresování pomocí registru, tak to implementuje kompilátor. Jestli nejdříve inkrementuje x jako unsigned char a přičte (nebo dá jako offset) k adrese, nebo přičte k adrese (adresa bývá větší než byte) a jako offset dá jedna? Podle mě by bylo obojí správně a záleží jen na kompilátoru, jak se rozhodne. Ale každý dá jiný výsledek ...

V případě s '& 0xFF' vždy musí dojít k limitaci.

Mohl bych vás (tedy původního autora vlákna) požádat o výpis jak se to přeložilo? Mohlo by být jasněji.

Dne 29.8.2016 v 13:27 Hynek Sladky napsal(a):
> Cekal bych, ze se x+1 vyhodnoti jako int.
> Pro spravne chovani bych to obalil bitovym maskovanim:
> arrayA[(x+1)&0xFF]
>
> Hynek Sladky
>
>
> Dne 29.8.2016 12:53, Miroslav Draxal napsal(a):
>>
>> Je to hodně zjednodušené, to x se používá v programu. Nějak nerozumím 
>> tomu, že si kompilátátor může dělat co chce. Je to char, obsahuje hodnotu 0xff, po odečtení musí přetéct do nuly.
>>
>> *From:*Hw-list [mailto:hw-list-bounces na list.hw.cz] *On Behalf Of 
>> *Jindroush
>> *Sent:* Monday, August 29, 2016 12:35 PM
>> *To:* HW-news
>> *Subject:* Re: C: co lze očekávat
>>
>> Asi prijdu s Wekem po funuse, ale obecne je to x-- undefined 
>> behaviour a kompilator muze delat, co chce ;-)
>>
>> http://stackoverflow.com/questions/18186987/decrementing-a-pointer-ou
>> t-of-bounds-incrementing-it-into-bounds i s odkazy na c99
>>
>> On 29.8.2016 12:22, Miroslav Draxal wrote:
>>
>>     Dobrý den,
>>
>>     Minulý týden jsem zde dával report o pnou předpokládané chybě c XC8. Nějak v tom tápe i Michrochip. Mám dojem, že na
>>     tam mají zaměstnaného studenta, který filtruje zprávy. Jednou píše že je to OK, jednou že je to chyba. Co na to
>>     zdejší odborníci na C. O co jde.
>>
>>     Mějme následující kód.
>>
>>     char arrayA[3]@0x123;
>>
>>     char x;
>>
>>     x = 0;
>>
>>         x--; // x=0xff
>>
>>         if ( arrayA[x + 1]) {……..}
>>
>>     z jaké adresy má brát if prvek z pole array? Jedná se mi o ten konstrukt x+1. X je char, čili přeteče na 0x00. Má
>>     ukazovat na  0x123 nebo má brát konstrukt arrayA[x + 1]) přetečení a ukazovat na 0x223?
>>
>>     U XC8 to teď to je tak, že pokud je array uloženo na 0x023 tak toto ukazuje na adresu 0x023 a pokud je array uloženo
>>     na 0x123 tak to ukazuje na adresu 0x223.
>>
>>     Jak to tedy je?
>>
>>
>>
>> --
>> Jindroush<jindroush na seznam.cz> <mailto:jindroush na seznam.cz>
>>
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz Hw-list na list.hw.cz 
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
_______________________________________________
HW-list mailing list  -  sponsored by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list