| .macro

Previous | Assembler Directives | Next

Syntax: .macro macname [macargs...]
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 (recursive) 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.
\
  `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.