avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] (no subject)


From: Advait Jain
Subject: [avr-gcc-list] (no subject)
Date: Mon, 17 Jul 2006 13:07:03 +0530


Hello,

I wrote a function which copies the contents of a global array into a local array to see how avr-gcc allocates local arrays on the stack.

void try1(void)
{
    char a[20];
    unsigned char i;
    
    for(i=0;i<20;i++)
        a[i] = com1_msgbuf[i];
}

the assembly for this function is this: (from the .lss file)

void try1(void)
{
    5a40:    cf 93           push    r28
    5a42:    df 93           push    r29
    5a44:    cd b7           in    r28, 0x3d    ; 61
    5a46:    de b7           in    r29, 0x3e    ; 62
    5a48:    64 97           sbiw    r28, 0x14    ; 20
    5a4a:    0f b6           in    r0, 0x3f    ; 63
    5a4c:    f8 94           cli
    5a4e:    de bf           out    0x3e, r29    ; 62
    5a50:    0f be           out    0x3f, r0    ; 63
    5a52:    cd bf           out    0x3d, r28    ; 61
    5a54:    de 01           movw    r26, r28
    5a56:    11 96           adiw    r26, 0x01    ; 1
    5a58:    ef e7           ldi    r30, 0x7F    ; 127
    5a5a:    f6 e0           ldi    r31, 0x06    ; 6
    5a5c:    93 e1           ldi    r25, 0x13    ; 19
    char a[20];
    unsigned char i;
   
    for(i=0;i<20;i++)
        a[i] = com1_msgbuf[i];
    5a5e:    81 91           ld    r24, Z+
    5a60:    8d 93           st    X+, r24
    5a62:    91 50           subi    r25, 0x01    ; 1
    5a64:    97 ff           sbrs    r25, 7
    5a66:    fb cf           rjmp    .-10         ; 0x5a5e
    5a68:    64 96           adiw    r28, 0x14    ; 20
    5a6a:    0f b6           in    r0, 0x3f    ; 63
    5a6c:    f8 94           cli
    5a6e:    de bf           out    0x3e, r29    ; 62
    5a70:    0f be           out    0x3f, r0    ; 63
    5a72:    cd bf           out    0x3d, r28    ; 61
    5a74:    df 91           pop    r29
    5a76:    cf 91           pop    r28
    5a78:    08 95           ret


What I want to know is why did the compiler save SREG in r0, disable all the interrupts, restored only the upper byte of the stack pointer, restore SREG and then copy the lower byte of the stack pointer. (5a4a to 5a52).

--
Advait Jain

4th Year undergraduate
Computer Science and Engg.
Indian Institute of Technology, Delhi



reply via email to

[Prev in Thread] Current Thread [Next in Thread]