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