Cykly DO-WHILE, FOR-LOOP (assembler): Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
(Vytvorená stránka „Kategória :Konfigurovateľné mikroprocesorové systémy Kategória :Programové konštrukcie assembleru M8C Na rozdiel od konštrukcií, ako IF-ELSE a SWITCH-CAS…“)
 
d
Riadok 1: Riadok 1:
 
[[Kategória :Konfigurovateľné mikroprocesorové systémy]]
 
[[Kategória :Konfigurovateľné mikroprocesorové systémy]]
[[Kategória :Programové konštrukcie assembleru M8C]]
 
  
 
Na rozdiel od konštrukcií, ako IF-ELSE a SWITCH-CASE, v ktorých sa pre daný prípad vykoná daná činnosť len raz,  
 
Na rozdiel od konštrukcií, ako IF-ELSE a SWITCH-CASE, v ktorých sa pre daný prípad vykoná daná činnosť len raz,  
Riadok 20: Riadok 19:
 
Vo vyšších jazykoch vyzerá DO-WHILE cyklus napríklad takto:
 
Vo vyšších jazykoch vyzerá DO-WHILE cyklus napríklad takto:
  
While (hodnota != 100){  
+
<source lang="c">
hodnota++;
+
while (hodnota != 100){  
CALL LED_1_Invert();
+
hodnota++;
}
+
CALL LED_1_Invert();
 +
}
 +
</source>
  
 
Tento istý program prepísaný do assemblera vyzerá nasledovne:
 
Tento istý program prepísaný do assemblera vyzerá nasledovne:
  
while1:
+
<source lang="asm">
INC hodnota ; hodnota = hodnota+1
+
while1:
CALL LED_1_Invert
+
INC hodnota ; hodnota = hodnota+1
CMP hodnota,100 ; porovnaj hodnota,100
+
CALL LED_1_Invert
JNZ while1 ; ak hodnota-100 <> 0, skoč na while1
+
CMP hodnota,100 ; porovnaj hodnota,100
 +
JNZ while1 ; ak hodnota-100 <> 0, skoč na while1
 +
</source>
  
 
V prípade nekonečnej podmienky použijeme obyčajný skok, JMP
 
V prípade nekonečnej podmienky použijeme obyčajný skok, JMP
  
while2:
+
<source lang="asm">
...
+
while2:
JMP while2
+
...
 +
JMP while2
 +
</source>
  
 
=FOR-LOOP cyklus=
 
=FOR-LOOP cyklus=
Riadok 47: Riadok 52:
 
Vo vyššom jazyku vyzerá FOR cyklus takto:
 
Vo vyššom jazyku vyzerá FOR cyklus takto:
  
For (i = 0; i<100; i++){
+
<source lang="c">
CALL LED_1_Invert();
+
for (i = 0; i<100; i++){
}
+
CALL LED_1_Invert();
 +
}
 +
</source>
  
 
Podobný program prepísaný do assemblera vyzerá takto:
 
Podobný program prepísaný do assemblera vyzerá takto:
  
MOV hodnota,0
+
<source lang="asm">
for1:
+
MOV hodnota,0
CALL LED_1_Invert
+
for1:
INC hodnota
+
CALL LED_1_Invert
CMP hodnota,100
+
INC hodnota
JNZ for1
+
CMP hodnota,100
 +
JNZ for1
 +
</source>
  
 
Všimnite si podobnosť s WHILE cyklom, ktorá vznikla kvôli tomu, že v oboch cykloch vieme, koľko krát časť programu opakujeme.
 
Všimnite si podobnosť s WHILE cyklom, ktorá vznikla kvôli tomu, že v oboch cykloch vieme, koľko krát časť programu opakujeme.

Verzia zo dňa a času 14:19, 8. február 2011


Na rozdiel od konštrukcií, ako IF-ELSE a SWITCH-CASE, v ktorých sa pre daný prípad vykoná daná činnosť len raz,

cykly túto činnosť opakujú. V prípade FOR-LOOP cyklu sa činnosť opakuje n-krát. V prípade DO-WHILE sa činnosť

opakuje, kým je splnená podmienka, takže môžeme nastaviť počet opakovaní inkrementáciou premennej, alebo podmieniť

cyklus vonkajším vstupom.

DO-WHILE cyklus

While cyklus používame napríklad v hlavnom cykle programu, vtedy väčšinou s podmienkou, ktorá je vždy platná,

napríklad true, alebo 0 == 0. Taktiež ho používame napríklad pri čakaní na stlačenie tlačidla, alebo iný vstup. Kým

nie je tlačidlo stlačené, program je zacyklený vo WHILE cykle a jeho stlačením ho ukončíme.

Vo vyšších jazykoch vyzerá DO-WHILE cyklus napríklad takto:

while (hodnota != 100){ 
	hodnota++;
	CALL LED_1_Invert();
}

Tento istý program prepísaný do assemblera vyzerá nasledovne:

while1:
INC hodnota		; hodnota = hodnota+1
CALL LED_1_Invert	
CMP hodnota,100		; porovnaj hodnota,100
JNZ while1		; ak hodnota-100 <> 0, skoč na while1

V prípade nekonečnej podmienky použijeme obyčajný skok, JMP

while2:
...
JMP while2

FOR-LOOP cyklus

For cyklus používame vtedy, ak vieme, koľko krát chceme činnosť opakovať. Môžeme ho použiť napríklad pri meraní a

priemerovaní, kedy meriame vstup napríklad 128×, výsledky spočítavame a následne ich delíme 128.

Vo vyššom jazyku vyzerá FOR cyklus takto:

for (i = 0; i<100; i++){
	CALL LED_1_Invert();
}

Podobný program prepísaný do assemblera vyzerá takto:

MOV hodnota,0
for1:
CALL LED_1_Invert
INC hodnota
CMP hodnota,100
JNZ for1

Všimnite si podobnosť s WHILE cyklom, ktorá vznikla kvôli tomu, že v oboch cykloch vieme, koľko krát časť programu opakujeme.