From: SourceForge.net <no...@so...> - 2009-09-17 08:25:36
|
Bugs item #2858242, was opened at 2009-09-14 01:13 Message generated for change (Comment added) made by ekengar You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2858242&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: mcs51(8051) target Group: None Status: Open Resolution: None Priority: 5 Private: No Submitted By: Kenan Garibov (ekengar) Assigned to: Nobody/Anonymous (nobody) Summary: Incorrect array element address calculation Initial Comment: The incorrect code generation bug found during comiplation of the following code: unsigned short s = buffer [size - 2] | (buffer [size - 1] << 8); Here size is the variable of unsigned char type. In attached code buffer is located at 0x0000 in external RAM. for buffer [size - 2] compiler generates the following code: 008D E5 08 174 mov a,_size 008F 24 FE 175 add a,#0xfe+_buffer 0091 F5 82 176 mov dpl,a 0093 E4 177 clr a 0094 34 00 178 addc a,#(_buffer >> 8) 0096 F5 83 179 mov dph,a 0098 E0 180 movx a,@dptr 0099 FA 181 mov r2,a Assume that size = 2 at running this code. Low byte of the address is calculated correctly. It is 0. But addc command is used for high byte of the address. It adds carry bit to the result, this bit was set to 1 before so high byte of the address is 0x100 instead of 0x0000. Bug was observed on 2.8.0 and 2.9.0 revision. Last test was done on sdcc 2.9.0: SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 2.9.0 #5416 (Mar 22 2009) (UNIX) The attached code can be compiled using: sdcc test.c ---------------------------------------------------------------------- >Comment By: Kenan Garibov (ekengar) Date: 2009-09-17 13:25 Message: I think the correct generated code with minimal changes must be: 008D E5 08 174 mov a,_size 008F 24 FE 175 add a,#0xfe+_buffer 0091 F5 82 176 mov dpl,a 0093 E4 177 clr a 0094 34 00 178 addc a,#0xff + (_buffer >> 8) 0096 F5 83 179 mov dph,a 0098 E0 180 movx a,@dptr 0099 FA 181 mov r2,a because we have to add 0xfffe to the address for -2 not to 0x00fe. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=2858242&group_id=599 |