Nepodmienený a podmienený cyklus


<= =>


ASM86 má i pre cyklus inštrukciu. Jej použitie však predpokladá to, že si rezervujeme register CX pre čítanie. Do neho pred cyklom umiestnime počet opakovaní. Inštrukcia LOOP potom cyklus umožní realizovať.

#include <stdio.h>
#include <conio.h>
unsigned char pole[10];
unsigned char i;
main() {
  clrscr();
  asm {
    XOR DI, DI     // nuluj register DI
    MOV CX, 10     // do CX daj dĺžku poľa
  }
  nav:             // návestie, začiatok cyklu
  asm {
    MOV BYTE PTR [DI+OFFSET pole], cl // presuň do poľa na miesto urč. DI
    INC DI         // na ďalší prvok poľa
    LOOP nav       // odčítaj od CX 1, ak nie je nula choď na nav
  }
  for (i=0; i<=9; i++)
    printf("%d",pole[i]);
  getch();
}

Uvedený príklad naplní pole hodnotami 1-10. Obsah v registru CX je použitý ku krokovaniu, a súčasne sa s ním plní pole. Prvky pole sú slabiky. Preto sa obsah registru DI zvyšuje o jednu. V prípade, že by sa jednalo o slová, musíme k registru DI pričítať 2. Cyklu vytvorenému pomocou LOOP sa môžeme programovo vyhnúť inštrukciou JCXZ návestie - ak je v CX nula presuň sa na návestie.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
unsigned char pole1[10], pole2[10];
unsigned char i;
unsigned int pocet;
void main() {
  clrscr();
  do {
    printf("Zadaj pocet kopirovanych prvkov (0..10):");
    scanf("%2d",&pocet);
  } while (pocet>10);
  randomize();
  for (i=0; i<=9; i++) {
    pole1[i] = random(256);
    pole2[i] = random(256);
  }
  asm {
    MOV CX, pocet          // do registru CX daj počet prvkov kópie
    JCXZ koniec            // ak je nulový choď na koniec
    MOV SI, OFFSET pole1   // naber adresu pole1
    MOV DI, OFFSET pole2   // naber adresu pole2
  }
  cykl: // začiatok cyklu
  asm {
  MOV AL, [SI]   // do registru AL presuň prvok z pole1
  MOV [DI], AL   // z registru AL presuň prvok do pole2
  INC SI         // posuň se na ďalší prvok v poliach
  INC DI
  LOOP cykl      // zníž CX o jednu, ak je rôzne od nuly skok na cykl
  }
  koniec:        // koniec bloku asm
  for (i=0; i<=9; i++)
    printf("\n%d..%d",pole1[i],pole2[i]);
  getch();
}

Až doteraz sme za podmienku opakovania považovali nenulové číslo v registru CX. ASM86 však umožňuje podmienky opakovania obohatiť testovaním príznaku ZF.

Pri použití týchto inštrukcií dávame v programe možnosť uniknúť z cyklu i nastavením príznaku ZF. Nezabudnite ale, že ZF sa musí pred koncom cyklu opäť nastaviť vhodnou inštrukciou.


<= =>