WinAVR-20080512 c оптимизацией -Os
Юзаю AVR Studio 4.14

Исходник:
Код
typedef volatile struct
{
    char* buffer;
    u08 size;
    u08 wr_index;
    u08 rd_index;
    u08    char_cnt;
    unsigned char overflow:1;
        
}FifoBuff08;          

FifoBuff08 urc_fifo;

int main(void)
{
    init_buff08(&urc_fifo, urc_buffer, URC_SIZE);
    
    push_buff08(data, &urc_fifo);
    data = pop_buff08(&urc_fifo);
    
}

char pop_buff08 (FifoBuff08* fifo)
{
    if(fifo->rd_index == fifo->wr_index)
    {
        return 0;
    }
    char data =    fifo->buffer[fifo->rd_index];
    if(++(fifo->rd_index) == fifo->size)
    {
        fifo->rd_index = 0; //закальцовка
    }
    fifo->overflow = 0;
    fifo->char_cnt--;
    return data;
}

Листинг:
Код
@0000031C: pop_buff08
1049:     {
+0000031C:   01DC        MOVW    R26,R24          Copy register pair
1050:         if(fifo->rd_index == fifo->wr_index)
+0000031D:   9614        ADIW    R26,0x04         Add immediate to word
+0000031E:   919C        LD      R25,X            Load indirect
+0000031F:   9714        SBIW    R26,0x04         Subtract immediate from word
+00000320:   9613        ADIW    R26,0x03         Add immediate to word
+00000321:   918C        LD      R24,X            Load indirect
+00000322:   9713        SBIW    R26,0x03         Subtract immediate from word
+00000323:   1798        CP      R25,R24          Compare
+00000324:   F411        BRNE    PC+0x03          Branch if not equal
+00000325:   E0E0        LDI     R30,0x00         Load immediate
+00000326:   C028        RJMP    PC+0x0029        Relative jump
1054:         char data = fifo->buffer[fifo->rd_index];
+00000327:   91ED        LD      R30,X+           Load indirect and postincrement
+00000328:   91FC        LD      R31,X            Load indirect
+00000329:   9711        SBIW    R26,0x01         Subtract immediate from word
+0000032A:   9614        ADIW    R26,0x04         Add immediate to word
+0000032B:   918C        LD      R24,X            Load indirect
+0000032C:   9714        SBIW    R26,0x04         Subtract immediate from word
+0000032D:   0FE8        ADD     R30,R24          Add without carry
+0000032E:   1DF1        ADC     R31,R1           Add with carry
+0000032F:   81E0        LDD     R30,Z+0          Load indirect with displacement
1055:         if(++(fifo->rd_index) == fifo->size)
+00000330:   9614        ADIW    R26,0x04         Add immediate to word
+00000331:   918C        LD      R24,X            Load indirect
+00000332:   9714        SBIW    R26,0x04         Subtract immediate from word
+00000333:   5F8F        SUBI    R24,0xFF         Subtract immediate
+00000334:   9614        ADIW    R26,0x04         Add immediate to word
+00000335:   938C        ST      X,R24            Store indirect
+00000336:   9714        SBIW    R26,0x04         Subtract immediate from word
+00000337:   9614        ADIW    R26,0x04         Add immediate to word
+00000338:   919C        LD      R25,X            Load indirect
+00000339:   9714        SBIW    R26,0x04         Subtract immediate from word
+0000033A:   9612        ADIW    R26,0x02         Add immediate to word
+0000033B:   918C        LD      R24,X            Load indirect
+0000033C:   9712        SBIW    R26,0x02         Subtract immediate from word
+0000033D:   1798        CP      R25,R24          Compare
+0000033E:   F419        BRNE    PC+0x04          Branch if not equal
1057:             fifo->rd_index = 0; //закальцовка
+0000033F:   9614        ADIW    R26,0x04         Add immediate to word
+00000340:   921C        ST      X,R1             Store indirect
+00000341:   9714        SBIW    R26,0x04         Subtract immediate from word
1059:         fifo->overflow = 0;
+00000342:   9616        ADIW    R26,0x06         Add immediate to word
+00000343:   918C        LD      R24,X            Load indirect
+00000344:   9716        SBIW    R26,0x06         Subtract immediate from word
+00000345:   7F8E        ANDI    R24,0xFE         Logical AND with immediate
+00000346:   9616        ADIW    R26,0x06         Add immediate to word
+00000347:   938C        ST      X,R24            Store indirect
+00000348:   9716        SBIW    R26,0x06         Subtract immediate from word
1060:         fifo->char_cnt--;
+00000349:   9615        ADIW    R26,0x05         Add immediate to word
+0000034A:   918C        LD      R24,X            Load indirect
+0000034B:   9715        SBIW    R26,0x05         Subtract immediate from word
+0000034C:   5081        SUBI    R24,0x01         Subtract immediate
+0000034D:   9615        ADIW    R26,0x05         Add immediate to word
+0000034E:   938C        ST      X,R24            Store indirect
1062:     }
+0000034F:   2F8E        MOV     R24,R30          Copy register
+00000350:   9508        RET                      Subroutine return


Внимание, вопрос! А почему бы не сгенерить в 2 раза компактнее???? Вот хотя бы так?
Может какие то флаги в мейке спасут отца русской демократии?
Код
//Моя редакция в течение пары минут
pop_buff08
{
           MOVW    R26,R24          
    if(fifo->rd_index == fifo->wr_index)
           LDD         R25,X+4
           LDD         R24,X+3
           CP      R25,R24          
           BRNE    PC+0x03          
           LDI     R30,0x00        
           RJMP    PC+0x00xx        
    char data = fifo->buffer[fifo->rd_index];
           LD      R30,X          
           LDD     R31,X+1        
           LDD     R24,X+4        
           ADD     R30,R24        
           ADC     R31,R1          
           LDD     R30,Z+0        
    if(++(fifo->rd_index) == fifo->size)
           LD      R24,X+4          
           SUBI    R24,0xFF        
           STD     X+4,R24          
           LDD     R25,X+4          
           LDD     R24,X+2          
           CP      R25,R24          
           BRNE    PC+0x04          
        fifo->rd_index = 0; //закальцовка
           STD     X+4,R1          
    fifo->overflow = 0;
           LDD     R24,X+6          
           ANDI    R24,0xFE        
           STD     X+6,R24          
    fifo->char_cnt--;
           LDD     R24,X+5          
           SUBI    R24,0x01        
           STD     X+5,R24          
}
           MOV     R24,R30          
           RET