NASM's TIMES prefix, though useful, cannot be used to
invoke a multi-line macro multiple times, because it is processed by NASM after macros
have already been expanded. Therefore NASM provides another form of loop, this time at
the preprocessor level: %rep.
The directives %rep and %endrep (%rep takes a numeric
argument, which can be an expression; %endrep takes no
arguments) can be used to enclose a chunk of code, which is then replicated as many times
as specified by the preprocessor:
%assign i 0
%rep 64
inc word [table+2*i]
%assign i i+1
%endrep
This will generate a sequence of 64 INC instructions,
incrementing every word of memory from [table] to [table+126].
For more complex termination conditions, or to break out of a repeat loop part way
along, you can use the %exitrep directive to terminate the
loop, like this:
fibonacci:
%assign i 0
%assign j 1
%rep 100
%if j > 65535
%exitrep
%endif
dw j
%assign k j+i
%assign i j
%assign j k
%endrep
fib_number equ ($-fibonacci)/2
This produces a list of all the Fibonacci numbers that will fit in 16 bits. Note that
a maximum repeat count must still be given to %rep. This is
to prevent the possibility of NASM getting into an infinite loop in the preprocessor,
which (on multitasking or multi-user systems) would typically cause all the system memory
to be gradually used up and other applications to start crashing.