Nepodmíněný a podmíněný cyklus
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.
- LOOP
návěští - od CX odečti jedna, jestliže je
CX<>0 skoč na návěští
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.
- LOOPE
návěští <=> LOOPZ návěští
- sniž CX o jednu a přesuň se na návěští při (CX
<> 0) AND (ZF = 1)
- LOOPNE
návěští <=> LOOPNZ
návěští<=> LOOP návěští - sniž CX o jednu
a přesuň se na návěští při (CX <> 0) AND (ZF
= 0)
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í.
|