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
>You're using %d to print chars - which is a very common mistake. >You need to use %bd No he's not. The variable being printed with %d is "x", which is a short int. Note that x was 10d = 0x0A it got changed to 12554d = 0x310A So it looks like an ASCII '1' has been written into the upper byte of x. How is XDATA implemented on your hardware? Maybe the upper address byte is not being latched properly, or something else is modifying it.
Keil use "big endian" storage for integers, so the upper byte of x is at address 0x019c, so I am confident that you have a hardware problem with the upper half of the address for XDATA.