Peter Jansen napisaĆ(a):
Hmm, I see
30: 81 4f 0c 00 mov r15, 12(r1) ;
not
push r15, 12(r1)
in your output ?
Albert
> Hi All,
>
> I have some strange code with gcc-3.2.3/binutils 2.16.1/msp430-libc
> (from the cvs).
>
> I have a function that takes a function pointer, this function pointer
> gets pushed onto the stack.
>
> The function prolog pushes the function pointer onto the stack as
>
> push r15, 12(r1)
>
> and then uses it in the function as
>
> call 12(r1)
>
> which is incorrect, because the call function decrements the stack
> pointer, then does the indirection, it should compile as
>
> call 10(r1)
>
> this appears to be a msp430-gcc bug and is quite hard to replicate.
>
> Here is the output from msp430-objdump
>
>> int vuprintf(register int (*func)(int), const char *fmt, va_list ap) {
>> 14: 0b 12 push r11 ;
>> 16: 0a 12 push r10 ;
>> 18: 09 12 push r9 ;
>> 1a: 08 12 push r8 ;
>> 1c: 07 12 push r7 ;
>> 1e: 06 12 push r6 ;
>> 20: 05 12 push r5 ;
>> 22: 04 12 push r4 ;
>> 24: 31 80 1c 00 sub #28, r1 ;#0x001c
>> 28: 81 43 10 00 mov #0, 16(r1) ;r3 As==00
>> 2c: 81 43 12 00 mov #0, 18(r1) ;r3 As==00
>> 30: 81 4f 0c 00 mov r15, 12(r1) ;
>> 34: 04 4e mov r14, r4 ;
>> 36: 81 4d 0e 00 mov r13, 14(r1) ;
>> union {
>> char c;
>> uint8_t u8;
>> int8_t i8;
>> long l;
>> unsigned long ul;
>> char *pc;
>> #if PRINTF_LEVEL >= PRINTF_FLT
>> double d;
>> div_t dv;
>> #endif
>> } a;
>> char c; /* holds a char from the format string */
>> uint8_t base = 10;
>> 3a: f1 40 0a 00 mov.b #10, 20(r1) ;#0x000a
>> 3e: 14 00 char b[BUFLEN]; /*
>> * Contains character representation of the
>> * number and its prefix, written from back
>> * to front.
>> */
>> char *pb = 0; /* used as pointer to an element in b */
>> 40: 81 43 16 00 mov #0, 22(r1) ;r3 As==00
>> int total_len;
>> #if PRINTF_LEVEL > PRINTF_MIN
>> int8_t width = 0;
>> 44: c1 43 18 00 mov.b #0, 24(r1) ;r3 As==00
>> int8_t prec = 0;
>> 48: c1 43 19 00 mov.b #0, 25(r1) ;r3 As==00
>> #endif
>> #if PRINTF_LEVEL >= PRINTF_FLT
>> int8_t decpt = 0;
>> char *fb; /* floating point buffer, malloc'ed */
>> #endif
>> #if PRINTF_LEVEL < PRINTF_STD
>> uint8_t flags;
>> #else
>> uint16_t flags;
>> #endif
>>
>> flags = 0;
>> 4c: 81 43 1a 00 mov #0, 26(r1) ;r3 As==00
>> total_len = 0;
>> #if PRINTF_LEVEL >= PRINTF_FLT
>> fb = 0;
>> #endif
>> // __write_char = func;
>>
>> DOPRINT('A');
>> 50: 3f 40 41 00 mov #65, r15 ;#0x0041
>> 54: 91 12 0c 00 call 12(r1) ;
>
>
> Anyone got any ideas?
>
> Thanks,
>