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

Begin the definition of a macro called macname. If your macro definition requires arguments, specify their names after the macro name, separated by commas or spaces. You can supply a default value for any macro argument by following the name with “=deflt”. For example, these are all valid .macro statements:

.macro comm

Begin the definition of a macro called comm, which takes no arguments.

.macro plus1 p, p1, .macro plus1 p p1

Either statement begins the definition of a macro called plus1, which takes two arguments; within the macro definition, write “\p” or “\p1” to evaluate the arguments.

.macro reserve_str p1=0 p2

Begin the definition of a macro called 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).

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

.endm

Mark the end of a macro definition.

.exitm

Exit early from the current macro definition.

\@

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