III.11.4 Local Symbols

Local symbols are symbols, which are only known within a macro body, but not outside the macro. Symbols that are defined for the whole program, will subsequently be called "global symbols" for better understanding. We are already familiar with a special case of local symbols: formal macro parameters. They appear in the macro definition only. Since they are substituted during macro expansion, we don't have further problems with them. But what happens with symbols that are defined in a macro body?


Example 1:

The following simple macro is intended to read a character from the 8051 UART, and to return it in A:
        RECEIVE MACRO
UARTIN: JNB RI,UARTIN
        MOV A,SBUF
        CLR RI
        ENDM
This will work only once! If the macro RECEIVE is called multiple times, the label UARTIN will be multiply defined.

This can be solved by simply declaring the symbol UARTIN local. For this, the LOCAL statement has been introduced. After the keyword LOCAL, a list of local symbols can be specified, separated by commas. These symbols will only be valid inside the macro that contains the LOCAL statement. LOCAL statements may only be placed directly after the MACRO or REPT statement, preceding the first body line. They may contain any number of local symbols. The macro body may be preceded by an arbitrary number of LOCAL statements.
Local symbols must be valid symbols, unique within the macro, and different from the formal parameters (if any). Keywords cannot be used as local symbol names. If a local symbol has the same name as a global symbol, the local scope takes precedance during substitution.
When a macro is expanded, its local symbols are always substituted: the formal parameters are replaced by the macro arguments, and the local symbols that have been declared in a LOCAL statement are replaced by unique, global symbol names, which the assembler generates during every expansion. These have always the format ??xxxx, where xxxx is a unique symbol number.


Example 2:

After a redesign of our previous macro RECEIVE using local symbols, it is looking as follows:
        RECEIVE MACRO
        LOCAL UARTIN
UARTIN: JNB RI,UARTIN
        MOV A,SBUF
        CLR RI
        ENDM
Enhanced as shown above, the macro will work correctly, as often as desired. When RECEIVE is called for the first time, the local symbol UARTIN will be replaced by ??0000,
??0000: JNB RI,??0000
        MOV A,SBUF
        CLR RI
when it is called for the second time, UARTIN will be replaced by ??0001, and so on:
??0001: JNB RI,??0001
        MOV A,SBUF
        CLR RI

However, it is recommended not to define global symbols in the format ??xxxx, to avoid name conflicts with substituted local symbols from expanded macros.



[contents] [up] [back] [next]