Desasemblujac sobie hex'a znalazłem dziwny odczyt rejestrów PINx,
gdzie kompilator najpierw czytał dwa razy rejestr i później maskował bity/bit w jednym odczycie i potem sprawdzał z drugim odczytem . Ogólnie wygląda jakby wykrywanie 1 (dla pinc) przy braku zmiany pozostałych wejść.
Ktoś może zetknął się z podobnym kodem ?
takie cos wykombinowałem z tego :
Dla zwykłego odczytu kompilator daje normalny kod:
wynik:
gdzie kompilator najpierw czytał dwa razy rejestr i później maskował bity/bit w jednym odczycie i potem sprawdzał z drugim odczytem . Ogólnie wygląda jakby wykrywanie 1 (dla pinc) przy braku zmiany pozostałych wejść.
Ktoś może zetknął się z podobnym kodem ?
in r25,p13
in r24,p13
ori r24,k10
cp r25,r24
brne L0196
; ----- branch on last line
in r18,p10
in r24,p10
ldi r19,k00
ldi r25,k00
andi r24,kEF
cp r18,r24
cpc r19,r25
brne L0196
takie cos wykombinowałem z tego :
if (((PINC | 0x10) == PINC) && ((PIND & 0xEF) == PIND))
Dla zwykłego odczytu kompilator daje normalny kod:
uint8_t testowa(void)
{
if (PINE & 0x02) return 1;
return 0;
}wynik:
745 testowa:
751 027c 85B1 in r24,37-0x20
752 027e 9927 clr r25
753 0280 9695 lsr r25
754 0282 8795 ror r24
756 0284 8170 andi r24,lo8(1)
757 0286 9070 andi r25,hi8(1)
759 0288 0895 ret
