unsigned char tp; unsigned char volatile pdata HOSTCFG2 _at_ 0x0020; // HOSTCFG2=0x40 at this point tp=HOSTCFG2 & 0x40; //!!! tp is 0x00 instead of 0x40 which is expected //Corresponding Disassembly: C:0x08F1 7820 MOV R0,#HOSTCFG2(0x20) C:0x08F3 E2 MOVX A,@R0 C:0x08F4 5440 ANL A,#HPWRSTATE(0x40) //Why it refers 0x40 as an address instead of a constant here? C:0x08F6 F508 MOV 0x08,A 189: if ((HOSTCFG2 & 0x40)==0x00)
Yes. Most tools will just pick the first symbol that matches the value that they see. But it doesn't bother me that the symbol is CSTARTUP. It bothers me that the immediate value in the instruction is 0000H when the _at_ keyword assigns the address 1040H. The code should read:
C:0x0800 900000 MOV DPTR,#SomeSymbol(0x1040)