9.3 'loop', 'LOOPNZ', 'loopnz' loops

-------------------------------------

Loops repeat a block of code until a specific variable or register

which acts as a loop counter has a value different from zero. After

execution of the block of code which contains the body of the loop, this

variable or register is reduced by 1 and then checked for whether it equals

zero. If the variable or register is not equal to zero, the loop body is

executed again and the process repeats.

An example of a loop with a variable used as a counter:

count = 5;

loop( count )

{WRITEWORD(count);

WRITELN();

}

Register CX is most effective for loops with a small body since in this

case the compiler generates a loop using the machine command 'LOOP'.

If the loop counter starts off at zero, the commands of the loop body

will be executed the maximum number of times for the variable range (256

times for an 8-bit counter with variable type byte or char, 65,536 times

for a 16-bit counter with variable type 'word' or 'int', and 4,294,967,296

times for a 32-bit counter with variable type 'dword' or 'dlong'.)

The following example executes a loop 256 times:

BH = 0;

loop (BH)

{

}

If the command specifies no loop counter, the loop will run forever.

The following example continuously outputs * to the screen:

loop()

WRITE('*');

The programmer may use or change the value of the loop counter variable

without a loop.

For instance, this loop is executed only three times:

CX = 1000;

loop( CX )

{

IF( CX > 3 )

CX = 3;

}

The operator can also abort a loop with 'BREAK' or 'break', as shown in

the following example:

CX = 1000;

loop( CX )

{

IF( CX > 3 )

BREAK;

}

In contrast to 'loop', in 'LOOPNZ' and 'loopnz' the loop argument is

checked for equality with zero before starting a loop. If the argument

equals zero, this loop body is not executed immediately (in this case the

loop body is executed the maximum number of times in the loop 'loop'). In

'LOOPNZ' it is most efficient when optimizing for code size if register

CX/ECX is used as the counter parameter. In this case the compiler will use

assembler instructions 'JCXZ/JECXZ' and 'LOOP'.