|
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.
|