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.