### 7.61 `.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. You cannot define two macros with the same macname unless it has been subject to the `.purgem` directive (See Purgem.) between the two definitions. 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.

`\@`
  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 `[ , ... ]`
  Warning: `LOCAL` is only available if you select “alternate macro syntax” with --alternate or `.altmacro` . See `.altmacro` .