[Icc-avr] Possible bug with post-increment?

John Baraclough j_baraclough at zetnet.co.uk
Thu Nov 22 10:18:50 PST 2007


Hi Thomas,

I have just compiled this code:

extern unsigned char Buffer[];
extern unsigned char Mask;
extern unsigned int Pointer;


   Buffer[Pointer++] |= Mask;

   Buffer[Pointer++] = Buffer[Pointer] | Mask;

   Buffer[Pointer] |= Mask;
   Pointer++;

   Buffer[Pointer] = Buffer[Pointer] | Mask;
   Pointer++;


and it works correctly. Here is the listing:


(0053)   Buffer[Pointer++] |= Mask;
      10B 9020 0201 LDS  R2,Pointer
      10D 9030 0202 LDS  R3,Pointer+1
      10F 01C1      MOVW R24,R2
      110 9601      ADIW R24,1
      111 9390 0202 STS  Pointer+1,R25
      113 9380 0201 STS  Pointer,R24
      115 E083      LDI  R24,3
      116 E092      LDI  R25,2
      117 0E28      ADD  R2,R24
      118 1E39      ADC  R3,R25
      119 0121      MOVW R4,R2
      11A 9020 0200 LDS  R2,Mask
      11C 01F2      MOVW R30,R4
      11D 8030      LDD  R3,Z+0
      11E 2832      OR   R3,R2
      11F 8230      STD  Z+0,R3
(0054)
(0055)   Buffer[Pointer++] = Buffer[Pointer] | Mask;
      120 9140 0201 LDS  R20,Pointer
      122 9150 0202 LDS  R21,Pointer+1
      124 01CA      MOVW R24,R20
      125 9601      ADIW R24,1
      126 9390 0202 STS  Pointer+1,R25
      128 9380 0201 STS  Pointer,R24
      12A E083      LDI  R24,3
      12B E092      LDI  R25,2
      12C 91E0 0201 LDS  R30,Pointer
      12E 91F0 0202 LDS  R31,Pointer+1
      130 0FE8      ADD  R30,R24
      131 1FF9      ADC  R31,R25
      132 8020      LDD  R2,Z+0
      133 9030 0200 LDS  R3,Mask
      135 2823      OR   R2,R3
      136 01FA      MOVW R30,R20
      137 0FE8      ADD  R30,R24
      138 1FF9      ADC  R31,R25
      139 8220      STD  Z+0,R2
(0056)
(0057)   Buffer[Pointer] |= Mask;
      13A 90A0 0201 LDS  R10,Pointer
      13C 90B0 0202 LDS  R11,Pointer+1
      13E 0EA8      ADD  R10,R24
      13F 1EB9      ADC  R11,R25
      140 9020 0200 LDS  R2,Mask
      142 01F5      MOVW R30,R10
      143 8030      LDD  R3,Z+0
      144 2832      OR   R3,R2
      145 8230      STD  Z+0,R3
(0058)   Pointer++;
      146 9180 0201 LDS  R24,Pointer
      148 9190 0202 LDS  R25,Pointer+1
      14A 9601      ADIW R24,1
      14B 9390 0202 STS  Pointer+1,R25
      14D 9380 0201 STS  Pointer,R24
(0059)
(0060)   Buffer[Pointer] = Buffer[Pointer] | Mask;
      14F E083      LDI  R24,3
      150 E092      LDI  R25,2
      151 90A0 0201 LDS  R10,Pointer
      153 90B0 0202 LDS  R11,Pointer+1
      155 0EA8      ADD  R10,R24
      156 1EB9      ADC  R11,R25
      157 9020 0200 LDS  R2,Mask
      159 01F5      MOVW R30,R10
      15A 8030      LDD  R3,Z+0
      15B 2832      OR   R3,R2
      15C 8230      STD  Z+0,R3
(0061)   Pointer++;
      15D 9180 0201 LDS  R24,Pointer
      15F 9190 0202 LDS  R25,Pointer+1
      161 9601      ADIW R24,1
      162 9390 0202 STS  Pointer+1,R25
      164 9380 0201 STS  Pointer,R24

I don't understand why the compiler is using R24 & R25 in your code 
and R2 & R3 in mine.

Sorry I can't be of anymore help. One for Richard I'm afraid.

All the best for now,
John

At 13:59 22/11/2007, you wrote:
>Hi all,
>
>after a two day debug session, I think I have found a bug:
>
>I have a module global array of unsigned char and an index variable. I post
>increment the index while write access to the array, but it seem to pre
>increment the index.
>
>Here are some snippets of the code and the assembler listing:
>
>----
>static volatile unsigned char *ucASCIIBuf = ucBinaryBuf; // Reuse 
>binary buffer
>static volatile unsigned int usBufferPos;
>
>
>void writeBuffer(unsigned char value)
>{
>         ucASCIIBuf[usBufferPos++] |= value;
>}
>
>----
>.lst
>
>(0253)                 ucASCIIBuf[usBufferPos++] |= ucResult;
>      77A 9180 0167 LDS  R24,ascii.c:usBufferPos
>      77C 9190 0168 LDS  R25,ascii.c:usBufferPos+1
>      77E 9601      ADIW R24,1
>      77F 9390 0168 STS  ascii.c:usBufferPos+1,R25
>      781 9380 0167 STS  ascii.c:usBufferPos,R24
>      783 9020 0133 LDS  R2,ascii.c:ucASCIIBuf
>      785 9030 0134 LDS  R3,ascii.c:ucASCIIBuf+1
>      787 9040 0167 LDS  R4,ascii.c:usBufferPos
>      789 9050 0168 LDS  R5,ascii.c:usBufferPos+1
>      78B 0C42      ADD  R4,R2
>      78C 1C53      ADC  R5,R3
>      78D 01F2      MOVW R30,R4
>      78E 8020      LDD  R2,Z+0
>      78F 282C      OR   R2,R12
>      790 8220      STD  Z+0,R2
>
>
>If I explizit increment the index, everything works fine:
>
>----
>static volatile unsigned char *ucASCIIBuf = ucBinaryBuf; // Reuse 
>binary buffer
>static volatile unsigned int usBufferPos;
>
>
>void writeBuffer(unsigned char value)
>{
>         ucASCIIBuf[usBufferPos] |= value;
>         usBufferPos++;
>}
>
>----
>.lst
>
>(0253)                 ucASCIIBuf[usBufferPos] |= ucResult;
>      77A 9020 0133 LDS  R2,ascii.c:ucASCIIBuf
>      77C 9030 0134 LDS  R3,ascii.c:ucASCIIBuf+1
>      77E 9040 0167 LDS  R4,ascii.c:usBufferPos
>      780 9050 0168 LDS  R5,ascii.c:usBufferPos+1
>      782 0C42      ADD  R4,R2
>      783 1C53      ADC  R5,R3
>      784 01F2      MOVW R30,R4
>      785 8020      LDD  R2,Z+0
>      786 282C      OR   R2,R12
>      787 8220      STD  Z+0,R2
>(0254)                          usBufferPos++;
>      788 9180 0167 LDS  R24,ascii.c:usBufferPos
>      78A 9190 0168 LDS  R25,ascii.c:usBufferPos+1
>      78C 9601      ADIW R24,1
>      78D 9390 0168 STS  ascii.c:usBufferPos+1,R25
>      78F 9380 0167 STS  ascii.c:usBufferPos,R24
>
>----
>
>I use V7.14B standard.
>
>regards,
>Thomas
>
>_______________________________________________
>Icc-avr mailing list
>Icc-avr at imagecraft.com
>http://dragonsgate.net/mailman/listinfo/icc-avr
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://dragonsgate.net/pipermail/icc-avr/attachments/20071122/42a760b2/attachment.html


More information about the Icc-avr mailing list