Arrays - Example

#include <stdio.h>

int
main(void) {
    int i;
    int numbers[256];

    i = 0;
    while (1) {
        printf("n? ");
        scanf("%d", &numbers[i]);
        if (numbers[i] < 0) break;
        i++;
    }
    j = 0;
    while (j < i) {
        printf("%d\n", numbers[j]);
        j++;
    }
    return 0;
}

translates to this AVR:
; i in r16
; r17 used for temporary values
; j in r18
; array numbers starting at 0x100
    LDI    r16, 0      ; i = 0
L1:                    ; while (1) {
    LDI    r26, 'n'    ; printf("n? ");
    LDI    r24, 3 
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL
    LDI    r26, '?'  
    LDI    r24, 3 
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL
    LDI    r26, ' '  
    LDI    r24, 3 
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL
    LDI    r24, 4     ; scanf("%d", &numbers[i]);
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL
	LDI	   r29, 1 	
    MOV    r28, r16    
    STD    Y+0, r24
    AND    r24, r24   ; if (numbers[i] < 0) break;
    BRBS   2, BREAK
    LDI    r17, 1
    ADD    r16, r17    ; i++
    LDI    r31, hi8(pm(L1))  
    LDI    r30, lo8(pm(L1))
    IJMP
BREAK:
    LDI    r18, 0      ; j = 0
L2:
    MOV    r17, r18    ; while (j < i)
    SUB    r17, r16
    BRBC   2, exit
    LDI    r24, 1      ; printf("%d\n", numbers[j]);
	LDI	   r29, 1 	
    MOV    r28, r18    
    LDD    r26, Y+0
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL
    LDI    r17, 1
    ADD    r18, r17    ; j++
    LDI    r31, hi8(pm(L2))  
    LDI    r30, lo8(pm(L2))
    IJMP
exit:
    LDI    r24, 0      ; exit
    LDI    r31, 0x70  
    LDI    r30, 0x00  
    ICALL

Index