Temporary labels are often very useful in macros. You can create
a macro definition that specifies temporary labels within it,
but these temporary labels might be duplicated elsewhere in the
temporary label block, possibly causing errors. However, the
assembler can create temporary labels in the macro expansion that
will not conflict with other temporary labels. These labels are
called created temporary labels.
Created temporary labels range from 30000$ to 65535$. Each time
the assembler creates a new temporary label, it increments the
numeric part of the label name by 1. Consequently, no user-
defined temporary labels should be in the range of 30000$ to
65535$.
A created temporary label is specified by a question mark (?) in
front of the formal argument name. When the macro is expanded,
the assembler creates a new temporary label if the corresponding
actual argument is blank. If the corresponding actual argument is
specified, the assembler substitutes the actual argument for the
formal argument.
The following example is a macro definition specifying a created
temporary label:
.MACRO POSITIVE ARG1,?L1
BGE ARG1,L1
NEGQ ARG1,ARG1
L1: .ENDM POSITIVE
The following three calls and expansions of the macro defined
previously show both created temporary labels and a user-defined
temporary label:
POSITIVE R0
BGE R0,30000$
NEGQ R0,R0
30000$:
POSITIVE R5
BGE R5,30001$
NEGQ R5,R5
30001$:
POSITIVE R7,10$
BGE R7,10$
NEGQ R7,R7
10$: