Mik is azok a macro-k? Ezek olyan kis programrészletek, amiket a fordító egy adott helyre bemásol. Igazság szerint a NASM angol doksija olyan nagy, hogy inkább csak mazsolázgatunk belőle :)

Egysoros makrók
Egysoros makrókat a %define utasítással hozhatunk létre.Lássunk egy példát:
        %define ctrl 0x1F &         %define param(a,b) ((a)+(a)*(b))                  mov byte [param(2,ebx)], ctrl 'D'
ami megegyezik a
                 mov byte [(2)+(2)*(ebx)], 0x1F & 'D'
sorral.

A makrók kis és nagybetű érzékenyek [nemtom`, hogy mi a case sensitive pontos magyar fordítása...], tehát a mac / Mac / MAC mind különböző macro lesz, kivéve, ha a macro-t így definiálod:

Ha azt szeretnénk, hogy a fordító NE különböztesse meg a kis és nagybetűket a macro nevében, akkor a %define elé egy i(insensitive) betűt írjunk, vagy %imacro-val helyettesítsük.
A makrókat overload-olni is lehet:

        %define foo(x) 1+x         %define foo(x,y) 1+x*y
így a preprocessor mindkét típusú makróhívást is képes lesz kezelni, azaz 'foo(3)' '1+3'-at fog adni, míg 'foo(ebx,2)' '1+ebx*2'-t.
Több soros makrók
Több soros makrót a %macro utasítással definiálhatunk:
        %macro makró_neve paraméterek_száma                ....         %endmacro
Itt egy példa:
        %macro prologue 1                push ebp                mov ebp,esp                sub esp,%1         %endmacro
Valamint egy másik példa két paraméter kezelésére:
        %macro butuska 2         %2:       db %1         %endmacro         butuska 'a', letter_a    -> letter_a:  db 'a'         butuska 'ab', string_ab  -> string_ab: db 'ab'         butuska {13,10}, crlf    -> crlf:      db 13,10
A %macro - kat fel is lehet turbózni :). Erre egy példa:
       %macro push 2                  push %1                  push %2        %endmacro
azaz
         push ebx               ; ez nem makró hívás          push eax,ecx           ; de ez AZ :)
Lokális címkék használata
Lokális címkét definiálása így történik: %%cimke
Rá pedig így hivatkozhatunk: jxy %%cimke
Egy példa:
       %macro retz 0               jnz %%skip               ret        %%skip:        %endmacro
Makró kiegészítés
Ha több paramétert adunk meg egy makrónak, mint ami megengedett, akkor az utolsó megengedett paraméterhez hozzácsapja a további paramétereket, de csak akkor, ha a paraméterek száma után egy '+' -ot írtunk.
   [pld]        %macro writefile 2+                  jmp %%endstr        %%str:    db %2        %%endstr: mov dx,%%str                  mov cx,%%endstr-%%str                  mov bx,%1                  mov ah,0x40                  int 0x21        %endmacro        writefile [filehandle],"hello, world",13,10
Default makró paraméterek
       %macro foobar 1-3 eax,[ebx+2]
1-től 3 paraméterrel meg lehet hívni. '%2', ha csak 1 paraméter volt, akkor eax-lesz, '%3', ha csak 2 paraméter volt, akkor [ebx+2] lesz.
%0: Makró paraméter számláló
%0 a makró paramétereink számát adja.
`%rotate': Makró paraméterek forgatása
A %rotate elforgatja a makró paramétereit a %rotate paraméterében megadott számmal. Ha ez a szám pozitív, akkor balra forgatja a paramétereket, ha negatív, akkor jobbra.
  Legyen 3 paraméterünk = {1,2,3}    %1 = 1    %2 = 2    %3 = 3        %rotate 1 után:  %1 = 2                         %2 = 3   Egy kis forrás:        %macro multipush 1-*        %rep %0                  push %1        %rotate 1        %endrep        %endmacro        multipush        ax bx cx dx fs gs        %macro multipop 1-*        %rep %0        %rotate -1                  pop %1        %endrep        %endmacro        multipop         ax bx cx dx fs gs
A makrókról kb. ennyit, akit jobban érdekel, az olvassa el a nasm doksiját.