AVRGCC 4.1.1При любой оптимизации:
Код
PORTD |= ( 1 << 1 );
d2: 91 9a sbi 0x12, 1 ; 18
При отключеной оптимизации:
Код
PORTD |= ( 1 << 1 );
de: a2 e3 ldi r26, 0x32; 50
e0: b0 e0 ldi r27, 0x00; 0
e2: e2 e3 ldi r30, 0x32; 50
e4: f0 e0 ldi r31, 0x00; 0
e6: 80 81 ld r24, Z
e8: 82 60 ori r24, 0x02; 2
ea: 8c 93 st X, r24
CodeVisionПри любой оптимизации:
Код
;PORTD |= ( 1 << 1 );
00007e 9a91 SBI 0x12,1
А также:
Код
;PORTD.1 = 1;
00007f 9a91 SBI 0x12,1
Как видно тут разницы нет никакой. Однако для следующего кода
CodeVision обходится всего одним регистром в отличии от
AVRGCC 4.1.1:
Код
PORTD = ( 1 << 0 );
PORTD = ( 1 << 1 );
PORTD = ( 1 << 2 );
PORTD = ( 1 << 3 );
PORTD = ( 1 << 4 );
PORTD = ( 1 << 5 );
PORTD = ( 1 << 6 );
PORTD = ( 1 << 7 );
AVRGCC 4.1.1:
Код
int main(void)
{
ce: 71 e0 ldi r23, 0x01; 1
d0: 62 e0 ldi r22, 0x02; 2
d2: 54 e0 ldi r21, 0x04; 4
d4: 48 e0 ldi r20, 0x08; 8
d6: 30 e1 ldi r19, 0x10; 16
d8: 20 e2 ldi r18, 0x20; 32
da: 90 e4 ldi r25, 0x40; 64
dc: 80 e8 ldi r24, 0x80; 128
while(1)
{
PORTD = ( 1 << 0 );
de: 72 bb out 0x12, r23; 18
PORTD = ( 1 << 1 );
e0: 62 bb out 0x12, r22; 18
PORTD = ( 1 << 2 );
e2: 52 bb out 0x12, r21; 18
PORTD = ( 1 << 3 );
e4: 42 bb out 0x12, r20; 18
PORTD = ( 1 << 4 );
e6: 32 bb out 0x12, r19; 18
PORTD = ( 1 << 5 );
e8: 22 bb out 0x12, r18; 18
PORTD = ( 1 << 6 );
ea: 92 bb out 0x12, r25; 18
PORTD = ( 1 << 7 );
ec: 82 bb out 0x12, r24; 18
CodeVision:
Код
; 34 PORTD = ( 1 << 0 );
00007a e0e1 LDI R30,LOW(1)
00007b bbe2 OUT 0x12,R30
; 35 PORTD = ( 1 << 1 );
00007c e0e2 LDI R30,LOW(2)
00007d bbe2 OUT 0x12,R30
; 36 PORTD = ( 1 << 2 );
00007e e0e4 LDI R30,LOW(4)
00007f bbe2 OUT 0x12,R30
; 37 PORTD = ( 1 << 3 );
000080 e0e8 LDI R30,LOW(8)
000081 bbe2 OUT 0x12,R30
; 38 PORTD = ( 1 << 4 );
000082 e1e0 LDI R30,LOW(16)
000083 bbe2 OUT 0x12,R30
; 39 PORTD = ( 1 << 5 );
000084 e2e0 LDI R30,LOW(32)
000085 bbe2 OUT 0x12,R30
; 40 PORTD = ( 1 << 6 );
000086 e4e0 LDI R30,LOW(64)
000087 bbe2 OUT 0x12,R30
; 41 PORTD = ( 1 << 7 );
000088 e8e0 LDI R30,LOW(128)
000089 bbe2 OUT 0x12,R30