the code is as follows: the declaration of two global variables: unsigned short int xdata x; unsigned char xdata META_TEDS[MAXINBUFF]; /*MAXINBUFF = 128*/ later in a function I have: for( x=2;x<12;x++ ){ printf( "UUID %d\r\n", x ); printf( "UUID address %p\r\n", &x ); printf( "META_TEDS address %p\r\n", &META_TEDS[x] ); META_TEDS[x]=_getkey( ); printf( "UUID %d\r\n", x ); printf( "UUID address %p\r\n", &x ); printf( "META_TEDS address %p\r\n", &META_TEDS[x] ); } all works well until the iteration where &META_TEDS[x] = 009c. here is what i get output in hyperterm: /*previous iterations are correct*/ UUID 8 UUID address x:019c META_TEDS address x:009a UUID 8 UUID address x:019c META_TEDS address x:009a UUID 9 UUID address x:019c META_TEDS address x:009b UUID 9 UUID address x:019c META_TEDS address x:009b UUID 10 UUID address x:019c META_TEDS address x:009c UUID 12554 UUID address x:019c META_TEDS address x:009c the iteration where x=10 is where the problem lies. under default and OPTIMIZE(0) it behaves the same. the assembly for the code segment "META_TEDS[x]=_getkey( );" is as follows: ; SOURCE LINE # 84 00AD 120000 E LCALL _getkey 00B0 900000 E MOV DPTR,#x+01H 00B3 E0 MOVX A,@DPTR 00B4 FE MOV R6,A 00B5 7400 E MOV A,#LOW META_TEDS 00B7 2E ADD A,R6 00B8 F582 MOV DPL,A 00BA E4 CLR A 00BB 3400 E ADDC A,#HIGH META_TEDS 00BD F583 MOV DPH,A 00BF EF MOV A,R7 00C0 F0 MOVX @DPTR,A it seems that in the above segment during the said iteration what _getkey() retrieves is put into 019c (x) instead of 009c (META_TEDS[x]). -Nathan
we have not modified the _getkey function and we have no pointers in the code. everything is a global variable. we are however running at 9600 baud using the following settings: T3CON = 0x82; T3FD = 0x12; SCON = 0x52; instead of reg51.h we are including aduc834.h from analog devices. it contains all that reg51 has plus maybe 2 or 3 other lines that reg51 does not have. we are using the ADuC834 evaluation board, and win2k sp3. -Nathan