Здравствуйте!
Скачал WinAVR-20060421, сейчас разбираюсь.
Возник вопрос.
Пишу код:
if( !(PINE & _BV(4)) ){...}
или
if( bit_is_clear(PINE,4) ){...}
компилирую и получаю:
7b0: 0c 99 sbic 0x01, 4 ;
7b2: 0b c0 rjmp .+22 ;
- все нормально.
А когда пишу код:
if( PINE & _BV(4) ){...}
или
if( bit_is_set(PINE,4) ){...}
то получаю (оптимизация =0,1,2,3):
7b4: 81 b1 in r24, 0x01
7b6: 99 27 eor r25, r25
7b8: 92 95 swap r25
7ba: 82 95 swap r24
7bc: 8f 70 andi r24, 0x0F
7be: 89 27 eor r24, r25
7c0: 9f 70 andi r25, 0x0F
7c2: 89 27 eor r24, r25
7c4: 81 70 andi r24, 0x01
7c6: 90 70 andi r25, 0x00
7c8: 88 23 and r24, r24
7ca: 69 f0 breq .+26
или даже (оптимизация =s):
7ac: 81 b1 in r24, 0x01
7ae: 99 27 eor r25, r25
7b0: 24 e0 ldi r18, 0x04
7b2: 96 95 lsr r25
7b4: 87 95 ror r24
7b6: 2a 95 dec r18
7b8: e1 f7 brne .-8 ; 0x7b2
7ba: 81 70 andi r24, 0x01
7bc: 90 70 andi r25, 0x00
7be: 20 91 40 01 lds r18, 0x0140
7c2: 88 23 and r24, r24
7c4: 59 f0 breq .+22
Что-то мне такой код не нравится.
Пока спасаюсь макросом:
#define jmp_if_bit_clear(port,bit,label)
__asm__ __volatile__(
"sbis %0,%1
" "rjmp " #label
::"I"(_SFR_IO_ADDR(port)),"I"(bit))
...
jmp_if_bit_set(PINE,4,L_120);
...
asm("L_120:":
;
...
Но может кто-нибудь посоветует что-нибудь попроще?