ASM86 má i pro cyklus instrukci. Její použití však předpokládá to, že si rezervujeme registr CX pro čítání. Do něj před cyklem umístíme počet opakování. Instrukce LOOP pak cyklus umožní realizovat.
Příklad:
uses crt;
var pole:array [0..9] of byte;
i:byte;
begin
clrscr;
asm
XOR
DI, DI {nuluj
registr DI}
MOV
CX, 10 {do CX
dej délku pole}
@nav: {návěští, začátek cyklu}
MOV
BYTE
PTR
[DI+OFFSET pole],
cl{přesuň do pole na místo urč. DI}
INC
DI {na
další prvek pole}
LOOP
@nav
{odečti od CX 1, není-li nula na @nav}
end;
for i:=0 to 9 do
writeln (pole[i]);
readkey;
end.
Uvedený příklad naplní pole hodnotami 1-10. Obsah v registru CX je použit ke krokování, a současně se s ním plní pole. Prvky pole jsou slabiky. Proto se obsah registru DI zvyšuje o jednu. V případě, že by se jednalo o slova, musíme k registru DI přičítat 2. Cyklu vytvořenému pomocí LOOP se můžeme programově vyhnout instrukcí JCXZ návěští - jestliže je v CX nula přesuň se na návěští.
Příklad:
uses crt;
var pole1,pole2:array [0..9] of byte;
i:byte;
pocet:word;
begin
clrscr;
repeat {vstup počtu prvků kopie s kontrolou hodnoty počet}
write ('Zadej pocet kopirovanych prvku (0..10):');
{$I-}readln (pocet);{$I+}
until (ioresult=0) and (pocet in [0..10]);
randomize;
for i:=0 to 9 do
begin
pole1[i]:=random(256);
pole2[i]:=random(256);
end;
asm
MOV
CX, pocet
{do registru CX dej počet prvků kopie}
JCXZ
@konec
{jestliže je nulový jdi na konec}
MOV
SI,
OFFSET
pole1 {naber adresu pole1}
MOV
DI,
OFFSET
pole2 {naber adresu pole2}
@cykl: {začátek cyklu}
MOV
AL, [SI]
{do registru AL přesuň prvek z pole1}
MOV
[DI], AL
{z registru AL přesuň prvek do pole2}
INC
SI
{posuň se na další prvek v
polích}
INC
DI
LOOP
@cykl
{sniž CX o jednu, jestli je různé od nuly}
{skok na @cykl}
@konec: {konec bloku asm}
end;
for i:=0 to 9 do
writeln (pole1[i],'..',pole2[i]);
readkey;
end.
Až dosud jsme za podmínku opakování považovali nenulové číslo v registru CX. ASM86 však umožňuje podmínky opakování obohatit testováním příznaku ZF.
Při použití těchto instrukcí dáváme v programu možnost uniknout z cyklu i nastavením příznaku ZF. Nezapomeňte ale, že ZF se musí před koncem cyklu opět nastavit vhodnou instrukcí.