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

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

Re: [avr-gcc-list] When does the Stack Frame Pointer (Y) get setup?


From: Weddington, Eric
Subject: Re: [avr-gcc-list] When does the Stack Frame Pointer (Y) get setup?
Date: Tue, 3 Jul 2012 18:21:09 +0000

Hi Bob,

Avr-libc user manual, section on Memory Sections:

http://www.nongnu.org/avr-libc/user-manual/mem_sections.html

According to that, it looks like .init2.

A disassembly of the whole program should allow you to verify what happens in 
the .initX sections.

I'm not sure why your program doesn't seem to work...

Eric

> -----Original Message-----
> From: address@hidden [mailto:avr-
> address@hidden On Behalf Of Bob
> Paddock
> Sent: Tuesday, July 03, 2012 11:06 AM
> To: AVR-GCC
> Subject: [avr-gcc-list] When does the Stack Frame Pointer (Y) get setup?
> 
> When does the Stack Frame Pointer (Y) get setup?
> 
> Should the following code work?  I find it trashing memory in bss:
> 
> void id_filter_init8( void ) __attribute__ ((naked)) __attribute__
> ((section(".init8")));
> void id_filter_init8( void )
> {
>   uint8_t ff_u8[128U];
> 
>   /* memset() should really be used here */
>   for( uint16_t idx_u16 = 0U; idx_u16 < (uint16_t) sizeof( ff_u8 ); idx_u16++
> )
>     {
>       ff_u8[ idx_u16 ] = 0U;
>     }
> 
>   /* Anything that makes ff_u8 be used, so it is not optimized away in
> this example: */
>   eeprom_update_block ( ff_u8, sysgrp_mask_eeprom_u8, sizeof(
> sysgrp_mask_eeprom_u8 ) );
> }
> 
> .lss:
> 
> 00008cc4 <__ctors_end>:
>     8cc4:     11 24           eor     r1, r1
>     8cc6:     1f be           out     0x3f, r1        ; 63
>     8cc8:     cf ef           ldi     r28, 0xFF       ; 255 Set Y and stack
>     8cca:     df e3           ldi     r29, 0x3F       ; 63
>     8ccc:     de bf           out     0x3e, r29       ; 62
>     8cce:     cd bf           out     0x3d, r28       ; 61
>     8cd0:     00 e0           ldi     r16, 0x00       ; 0
>     8cd2:     0c bf           out     0x3c, r16       ; 60
>     8cd4:     18 be           out     0x38, r1        ; 56
>     8cd6:     19 be           out     0x39, r1        ; 57
>     8cd8:     1a be           out     0x3a, r1        ; 58
>     8cda:     1b be           out     0x3b, r1        ; 59
> 
> [snip lots of stuff that changes r28/r29, doesn't save them]
> 
> [Is Y really a frame pointer value at this point?:]
> 
> void id_filter_init8( void ) __attribute__ ((naked)) __attribute__
> ((section(".init8")));
> void id_filter_init8( void )
> {
>     93b4:     fe 01           movw    r30, r28
>     93b6:     31 96           adiw    r30, 0x01       ; 1
> #include "event.h"
> extern void event_bug( void );
> #endif
> 
> void id_filter_init8( void ) __attribute__ ((naked)) __attribute__
> ((section(".init8")));
> void id_filter_init8( void )
>     93b8:     ce 01           movw    r24, r28
>     93ba:     8f 57           subi    r24, 0x7F       ; 127
>     93bc:     9f 4f           sbci    r25, 0xFF       ; 255
> {
>   uint8_t ff_u8[128U];
> 
>   for( uint16_t idx_u16 = 0U; idx_u16 < (uint16_t) sizeof( ff_u8 ); idx_u16++
> )
>     {
>       ff_u8[ idx_u16 ] = 0U;
>     93be:     11 92           st      Z+, r1
> void id_filter_init8( void ) __attribute__ ((naked)) __attribute__
> ((section(".init8")));
> void id_filter_init8( void )
> {
>   uint8_t ff_u8[128U];
> 
>   for( uint16_t idx_u16 = 0U; idx_u16 < (uint16_t) sizeof( ff_u8 ); idx_u16++
> )
>     93c0:     e8 17           cp      r30, r24
>     93c2:     f9 07           cpc     r31, r25
>     93c4:     e1 f7           brne    .-8             ; 0x93be 
> <id_filter_init8+0xa>
>     {
>       ff_u8[ idx_u16 ] = 0U;
>     }
> 
> [Looks like Y Frame Pointer is set and used as such from here on, and
> gets saved in function calls:]
> 
> MAIN_OS int main( void )
> {
>     95d2:     cd b7           in      r28, 0x3d       ; 61
>     95d4:     de b7           in      r29, 0x3e       ; 62
>     95d6:     cb 54           subi    r28, 0x4B       ; 75
>     95d8:     d0 40           sbci    r29, 0x00       ; 0
>     95da:     cd bf           out     0x3d, r28       ; 61
>     95dc:     de bf           out     0x3e, r29       ; 62
> 
> [more stuff]
> 
>   return( 0 ); /* When main() returns the .FINIsh function will be
> called to put I/O in its lowest power state.  Probably the same as the
> power up state */
> }/* main() */
>     9aec:     80 e0           ldi     r24, 0x00       ; 0
>     9aee:     90 e0           ldi     r25, 0x00       ; 0
>     9af0:     c5 5b           subi    r28, 0xB5       ; 181
>     9af2:     df 4f           sbci    r29, 0xFF       ; 255
>     9af4:     cd bf           out     0x3d, r28       ; 61
>     9af6:     de bf           out     0x3e, r29       ; 62
>     9af8:     08 95           ret
> 
> Did I miss anything in the documentation that would tell me not to use
> auto variables in .initX sections after .init2 that sets the stack?
> 
> _______________________________________________
> AVR-GCC-list mailing list
> address@hidden
> https://lists.nongnu.org/mailman/listinfo/avr-gcc-list



reply via email to

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