Hi,
I try to investigate a program written by a former collegue.
An 8-bit dipswitch is connected to the microcontroller address/data bus. Two variables are declared in an assembler file: public DIPSWITCH and public _DIPSWITCH. The dipswitch value is read bij an assembler file from address DIPSWITCH (the real hardware address) and stored in _DIPSWITCH. (_DIPSWITCH is to be used as the startup dipswitch value and DIPSWITCH is used as the real actual value). In a .C file both DIPSWITCH and _DIPSWITCH are declared as 'extern xdata unsigned char'. If I evaluate the startup value _DIPSWITCH in that .C file I get the actual value of DIPSWITCH. If I create only two code-lines:
if ( _DIPSWITCH){ do something} if ( DIPSWITCH){ do something}
and then I compile that source with '#pragma src' and look in the listfile I see:
MOV DPTR,#_DIPSWITCH MOV DPTR,#_DIPSWITCH
So both different .C source lines compile to the same assembler code.
Can someone explain this?
Thanks
Henk
The manual discusses a leading underscore for function names, sepending on calling convention. I didn't see anything about treatment of underscores for variable names.
The use of name mangling of symbols is normally there to allow the linker to perform type-safe linkage or to create private namespaces for RTL or startup files. It is normally not intended that multiple C symbols should end up mapping to the same ASM symbol.
Normal type-safe linking is only applicable to C++ and not to C, but the 8051 brings the additional problem of keeping track of which memory region a symbol is stored in.
By the way - "internal naming conventions" is not so "internal" if multiple C symbols results in a name collision.