6.1.9.28 Macro And Endm Directives
The MACRO … ENDM
directives provide for the definition of
assembly macros, optionally with arguments. See 6.1.9.16 Equ Directive for simple association of
a value with an identifier, or 5.14.1 Preprocessor Directives
for the preprocessor’s #define
macro directive, which can also
work with arguments.
The MACRO
directive should be preceded by the macro name
and optionally followed by a comma-separated list of formal arguments. When the
macro is used, the macro name should be used in the same manner as a machine
opcode, followed by a list of arguments to be substituted for the formal
parameters.
;macro: movlf - Move a literal value into a nominated file register
;args: arg1 - the literal value to load
; arg2 - the NAME of the source variable
movlf MACRO arg1,arg2
movlw arg1
movwf arg2 mod 080h
ENDM
movlf 2,tempvar
expands
to:movlw 2
movwf tempvar mod 080h
&
character can be used to permit the
concatenation of macro arguments with other text, but is removed in the actual
expansion. For example:loadPort MACRO port, value
movlw value
movwf PORT&port
ENDM
will load PORTA
if port
is
A
when called, etc. The special meaning of the
&
token in macros implies that you can not use the
bitwise AND
operator, (also represented by
&
), in assembly macros; use the and
form of
this operator instead.A comment can be suppressed within the expansion of a macro (thus saving
space in the macro storage) by opening the comment with a double semicolon,
;;
.
When invoking a macro, the argument list must be comma-separated. If it is
desired to include a comma (or other delimiter such as a space) in an argument
then angle brackets <
and >
can be used to
quote
See 6.1.9.27 Local Directive for use of unique local labels within macros.
By default, the assembly list file will show macro in an unexpanded
format; i.e., as the macro was invoked. Expansion of the macro in the listing file
can be shown by using the EXPAND
assembler directive (see 6.1.9.18 Expand Directive).