We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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
Look in the C51 Manual in the section about interfacing 'C' to assembler - that contains a lot of detail about the compiler's internal naming conventions...
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.