[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