Učebnice Assembleru 86

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í.

Směr