Hi, 

The previous message is not correct, i have found my error.

When i supervise the parameters's function, the debugger (gdb) returns to me 
wrong values for this parameters.

The debugger (gdb) maked me wrong, because the C compiler uses registers to 
optimize the code.




Sorry, thln !
  ----- Original Message ----- 
  From: thln 
  To: mspgcc-users 
  Sent: Tuesday, May 10, 2005 11:39 AM
  Subject: It seems that the C compiler overwrites registers !!!


  Hi, 


  Thanks, Chris Liechti, for your help about Re: Help about sizeof( struct ...) 
MSP430-GCC  (2005-04-26 16:46)   

  So, if i write the fowling function (Swap_TAB_UART), the result is not good.
  the function lose len, ix values.

  It seems that the C compiler overwrites registers !!!



  Kind Regards, Thln!



  void Swap_TAB_UART(unsigned char ix, unsigned char len)
  {
  unsigned char i, tmp, l;

  l = len/2;
  i = 0;
  do
    {
    tmp = TAB_UART[ix+i];
    TAB_UART[ix+i] = TAB_UART[ix+len-i-1];
    TAB_UART[ix+len-i-1] = tmp;
    i++;
    } while (i<l);
  }


  void main(void)
  {


  TAB_UART[15] = 0xC1;
  TAB_UART[16] = 0x20;
  TAB_UART[17] = 0x00;
  TAB_UART[18] = 0x00;

   Swap_TAB_UART(15, 4);
  }







  void Swap_TAB_UART(unsigned char ix, unsigned char len)
  {
      cd10: 0b 12        push r11  ;
      cd12: 0a 12        push r10  ;
      cd14: 09 12        push r9  ;
      cd16: 08 12        push r8  ;
      cd18: 04 12        push r4  ;
      cd1a: 4d 4f        mov.b r15, r13 ; R13 = ix
      cd1c: 4f 4e        mov.b r14, r15 ; R15 = len
  unsigned char i, tmp, l;

  l = len/2;
      cd1e: 49 4e        mov.b r14, r9 ;
      cd20: 12 c3        clrc   
      cd22: 49 10        rrc.b r9  ;    R9= len/2
  i = 0;
      cd24: 4c 43        clr.b r12  ;    R12=i
      cd26: 4e 4d        mov.b r13, r14 ;
      cd28: 7f f3        and.b #-1, r15 ;r3 As==11
  do
      cd2a: 38 40 20 02  mov #544, r8 ;#0x0220
      cd2e: 0a 4e        mov r14, r10 ;    
      cd30: 0a 58        add r8, r10 ;   R10=ix+220
      cd32: 0b 4e        mov r14, r11 ;
      cd34: 0b 5f        add r15, r11 ; R11 = ix+len
    {
    tmp = TAB_UART[ix+i];
      cd36: 4f 4c        mov.b r12, r15 ; len is lost !
      cd38: 0e 4a        mov r10, r14 ;   ix is lost ! 
      cd3a: 0e 5f        add r15, r14 ;
      cd3c: 6d 4e        mov.b @r14, r13 ; ix is lost !
    TAB_UART[ix+i] = TAB_UART[ix+len-i-1];
      cd3e: 04 4b        mov r11, r4 ;
      cd40: 04 8f        sub r15, r4 ;
      cd42: 0f 44        mov r4, r15 ;
      cd44: 0f 58        add r8, r15 ;
      cd46: de 4f ff ff  mov.b -1(r15),0(r14) ;
      cd4a: 00 00 
    TAB_UART[ix+len-i-1] = tmp;
      cd4c: cf 4d ff ff  mov.b r13, -1(r15) ;
    i++;
      cd50: 5c 53        inc.b r12  ;
    } while (i<l);
      cd52: 4c 99        cmp.b r9, r12 ;
      cd54: f0 2b        jnc $-30      ;abs 0xcd36
  }
      cd56: 34 41        pop r4  ;
      cd58: 38 41        pop r8  ;
      cd5a: 39 41        pop r9  ;
      cd5c: 3a 41        pop r10  ;
      cd5e: 3b 41        pop r11  ;
      cd60: 30 41        ret   

Reply via email to