[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
.macro
The commands .macro
and .endm
allow you to define macros that
generate assembly output. For example, this definition specifies a macro
sum
that puts a sequence of numbers into memory:
.macro sum from=0, to=5 .long \from .if \to-\from sum "(\from+1)",\to .endif .endm |
With that definition, `SUM 0,5' is equivalent to this assembly input:
.long 0 .long 1 .long 2 .long 3 .long 4 .long 5 |
.macro macname
.macro macname macargs ...
req
'), or whether it takes all of the remaining arguments
(through `:vararg
'). You can supply a default value for any
macro argument by following the name with `=deflt'. You
cannot define two macros with the same macname unless it has been
subject to the .purgem
directive (See section 7.78 .purgem name
.) between the two
definitions. For example, these are all valid .macro
statements:
.macro comm
comm
, which takes no
arguments.
.macro plus1 p, p1
.macro plus1 p p1
plus1
,
which takes two arguments; within the macro definition, write
`\p' or `\p1' to evaluate the arguments.
.macro reserve_str p1=0 p2
reserve_str
, with two
arguments. The first argument has a default value, but not the second.
After the definition is complete, you can call the macro either as
`reserve_str a,b' (with `\p1' evaluating to
a and `\p2' evaluating to b), or as `reserve_str
,b' (with `\p1' evaluating as the default, in this case
`0', and `\p2' evaluating to b).
.macro m p1:req, p2=0, p3:vararg
m
, with at least three
arguments. The first argument must always have a value specified, but
not the second, which instead has a default value. The third formal
will get assigned all remaining arguments specified at invocation time.
When you call a macro, you can specify the argument values either by position, or by keyword. For example, `sum 9,17' is equivalent to `sum to=17, from=9'.
Note that since each of the macargs can be an identifier exactly
as any other one permitted by the target architecture, there may be
occasional problems if the target hand-crafts special meanings to certain
characters when they occur in a special position. For example, if colon
(:
) is generally permitted to be part of a symbol name, but the
architecture specific code special-cases it when occuring as the final
character of a symbol (to denote a label), then the macro parameter
replacement code will have no way of knowing that and consider the whole
construct (including the colon) an identifier, and check only this
identifier for being the subject to parameter substitution. In this
example, besides the potential of just separating identifier and colon
by white space, using alternate macro syntax (See section 7.67 .altmacro
.) and
ampersand (&
) as the character to separate literal text from macro
parameters (or macro parameters from one another) would provide a way to
achieve the same effect:
.altmacro .macro label l l&: .endm |
This applies identically to the identifiers used in .irp
(See section 7.56 .irp symbol,values
....)
and .irpc
(See section 7.57 .irpc symbol,values
....).
.endm
.exitm
\@
as
maintains a counter of how many macros it has
executed in this pseudo-variable; you can copy that number to your
output with `\@', but only within a macro definition.
LOCAL name [ , ... ]
LOCAL
is only available if you select "alternate
macro syntax" with `--alternate' or .altmacro
.
See section .altmacro
.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |