Konštrukcia IF-ELSE (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 Konštrukciu IF-ELSE používame vtedy, keď je vykon…“)
 
d
 
(Jedna medziľahlá úprava od jedného ďalšieho používateľa nie je zobrazená)
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]]
+
{{sablona_mikroprocoserove_systemy|Programové konštrukcie assembleru M8C|Konštrukcia IF-ELSE (assembler)|Konštrukcia SWITCH-CASE (assembler)|Cykly DO-WHILE, FOR-LOOP (assembler)}}
 +
Konštrukciu IF-ELSE používame vtedy, keď je vykonanie časti programu závislé na podmienke. Praktickým použitím je napríklad kontrola, či bolo stlačené tlačidlo, a ak áno, zvýšime hodnotu niektorej premennej.
  
Konštrukciu IF-ELSE používame vtedy, keď je vykonanie časti programu závislé na podmienke. Praktickým použitím je
+
Okrem splnenia podmienky táto konštrukcia reaguje aj na jej nesplnenie. Vo vyšších programovacích jazykoch sa používa tento všeobecný zápis:
  
napríklad kontrola, či bolo stlačené tlačidlo, a ak áno, zvýšime hodnotu niektorej premennej.
+
<source lang="c">
 
+
If (podmienka) Then  
Okrem splnenia podmienky táto konštrukcia reaguje aj na jej nesplnenie. Vo vyšších programovacích jazykoch sa
+
(ak je podmienka splnena)
 
+
Else
používa tento všeobecný zápis:
+
(ak je podmienka nesplnena)
 
+
End If
If (podmienka) Then  
+
</source>
(ak je podmienka splnena)
 
Else
 
(ak je podmienka nesplnena)
 
End If
 
  
 
V prípade použitia jazyku C, ktorý používa aj PSoC Designer, píšeme podmienku takto:
 
V prípade použitia jazyku C, ktorý používa aj PSoC Designer, píšeme podmienku takto:
  
if (podmienka) {
+
<source lang="c">
(ak je podmienka splnená)
+
if (podmienka) {
}else{
+
(ak je podmienka splnená)
(ak je podmienka nesplnená)
+
}else{
}
+
(ak je podmienka nesplnená)
 +
}
 +
</source>
  
 
Ak je v then alebo else časti len jeden príkaz, nie je potrebné písať {} zátvorky okolo tejto jednej podmienky.
 
Ak je v then alebo else časti len jeden príkaz, nie je potrebné písať {} zátvorky okolo tejto jednej podmienky.
  
V assembleri používame na IF-ELSE konštrukciu skoky - JUMPs. Procesory Cypress PSoC poznajú šesť skokov, z toho dva  
+
V assembleri používame na IF-ELSE konštrukciu skoky - JUMPs. Procesory Cypress PSoC poznajú šesť skokov, z toho dva nepodmienené a štyri podmienené. Pre naše použitie potrebujeme práve podmienené skoky.
  
nepodmienené a štyri podmienené. Pre naše použitie potrebujeme práve podmienené skoky.
 
 
<center>
 
<center>
 
{|class=wikitable border=1 cellpadding=5
 
{|class=wikitable border=1 cellpadding=5
Riadok 59: Riadok 57:
 
</center>
 
</center>
  
Z tabuľky podmienených skokov vyplýva, že skoky závisia od dvoch príznakov - Carry Flag a Zero Flag. Pred príkazom  
+
Z tabuľky podmienených skokov vyplýva, že skoky závisia od dvoch príznakov - Carry Flag a Zero Flag. Pred príkazom skoku teda používame napríklad porovnávaciu inštrukciu CMP.
  
skoku teda používame napríklad porovnávaciu inštrukciu CMP.
+
<source lang="asm">
 
+
CMP A,4      ;A==4
CMP A,4      ;A==4
+
JZ navestie
JZ navestie
+
CMP A,4      ;A<>4  
CMP A,4      ;A<>4  
+
JNZ navestie
JNZ navestie
+
CMP A,4      ;A<4  
CMP A,4      ;A<4  
+
JC navestie
JC navestie
+
CMP A,4      ;A>=4  
CMP A,4      ;A>=4  
+
JNC navestie
JNC navestie
+
CMP A,4      ;A<=4   
CMP A,4      ;A<=4   
+
JZ navestie
JZ navestie
+
JC navestie
JC navestie
+
</source>
  
 
Praktický príklad porovnania, či hodnota == 10 vyzerá takto.
 
Praktický príklad porovnania, či hodnota == 10 vyzerá takto.
  
podmienka1:
+
<source lang="asm">
CMP hodnota,10 ;if (hodnota==10)
+
podmienka1:
JNZ podmienka1FALSE
+
CMP hodnota,10 ;if (hodnota==10)
... ;{
+
JNZ podmienka1FALSE
... ;hodnota==10
+
... ;{
... ;}
+
... ;hodnota==10
JMP podmienka1koniec
+
... ;}
podmienka1FALSE: ;else
+
JMP podmienka1koniec
+
podmienka1FALSE: ;else
... ;{
 
... ;hodnota<>10
 
... ;}
 
podmienka1koniec: ;koniec if-else
 
 
 
Tento príklad najprv porovná, či hodnota==10, a ak to nie je pravda, skočí na návestie "podmienka1FALSE". Ak
 
  
hodnota==10, vykonajú sa príkazy tesne pod inštrukciou "JNZ podmienka1FALSE" a následne sa skočí na koniec cyklu,
+
... ;{
 +
... ;hodnota<>10
 +
... ;}
 +
podmienka1koniec: ;koniec if-else
 +
</source>
  
aby sa nevykonali aj príkazy, ktoré patria ELSE vetve.
+
Tento príklad najprv porovná, či hodnota==10, a ak to nie je pravda, skočí na návestie "podmienka1FALSE". Ak hodnota==10, vykonajú sa príkazy tesne pod inštrukciou "JNZ podmienka1FALSE" a následne sa skočí na koniec cyklu, aby sa nevykonali aj príkazy, ktoré patria ELSE vetve.
  
 
V prípade, že nám stačí IF-THEN verzia, použijeme tento kód:
 
V prípade, že nám stačí IF-THEN verzia, použijeme tento kód:
  
podmienka2:
+
<source lang="asm">
CMP hodnota,10 ;if (hodnota==10)
+
podmienka2:
JNZ podmienka2koniec
+
CMP hodnota,10 ;if (hodnota==10)
... ;{
+
JNZ podmienka2koniec
... ;hodnota==10
+
... ;{
... ;}
+
... ;hodnota==10
podmienka2koniec
+
... ;}
 +
podmienka2koniec
 +
</source>

Aktuálna revízia z 09:47, 21. marec 2013

Predmet

Konfigurovateľné mikroprocesorové systémy
Tématická časť:
Programové konštrukcie assembleru M8C

Konštrukciu IF-ELSE používame vtedy, keď je vykonanie časti programu závislé na podmienke. Praktickým použitím je napríklad kontrola, či bolo stlačené tlačidlo, a ak áno, zvýšime hodnotu niektorej premennej.

Okrem splnenia podmienky táto konštrukcia reaguje aj na jej nesplnenie. Vo vyšších programovacích jazykoch sa používa tento všeobecný zápis:

If (podmienka) Then 
	(ak je podmienka splnena)
Else
	(ak je podmienka nesplnena)
End If

V prípade použitia jazyku C, ktorý používa aj PSoC Designer, píšeme podmienku takto:

if (podmienka) {
	(ak je podmienka splnená)
}else{
	(ak je podmienka nesplnená)
}

Ak je v then alebo else časti len jeden príkaz, nie je potrebné písať {} zátvorky okolo tejto jednej podmienky.

V assembleri používame na IF-ELSE konštrukciu skoky - JUMPs. Procesory Cypress PSoC poznajú šesť skokov, z toho dva nepodmienené a štyri podmienené. Pre naše použitie potrebujeme práve podmienené skoky.

Názov inštrukcie Zápis inštrukcie Popis Použitie
Jump if No Carry JNC <návestie> Skočí na návestie ak je Carry Flag (CF) rovné nule Ak výsledok predchádzajúcej operácie nepretiekol smerom nahor ani nadol, vykoná sa skok
Jump if Not Zero JNZ <návestie> Skočí na návestie ak je Zero Flag (ZF) rovné nule Ak výsledkom predchádzajúcej operácie nie je nula, vykoná sa skok
Jump if Carry JC <návestie> Skočí na návestie ak je Carry Flag (CF) rovné jednej Ak výsledok predchádzajúcej operácie pretiekol nahor alebo nadol, vykoná sa skok
Jump if Zero JZ <návestie> Skočí na návestie ak je Zero Flag (ZF) rovné jednej Ak výsledok predchádzajúcej operácie je nula, vykoná sa skok

Z tabuľky podmienených skokov vyplýva, že skoky závisia od dvoch príznakov - Carry Flag a Zero Flag. Pred príkazom skoku teda používame napríklad porovnávaciu inštrukciu CMP.

CMP A,4       ;A==4
JZ navestie
CMP A,4       ;A<>4 
JNZ navestie
CMP A,4       ;A<4 
JC navestie
CMP A,4       ;A>=4 
JNC navestie
CMP A,4       ;A<=4  
JZ navestie
JC navestie

Praktický príklad porovnania, či hodnota == 10 vyzerá takto.

podmienka1:
CMP hodnota,10			;if (hodnota==10)
JNZ podmienka1FALSE		
...				;{
...				;hodnota==10
...				;}
JMP podmienka1koniec
podmienka1FALSE:		;else

...				;{
...				;hodnota<>10
...				;}
podmienka1koniec:		;koniec if-else

Tento príklad najprv porovná, či hodnota==10, a ak to nie je pravda, skočí na návestie "podmienka1FALSE". Ak hodnota==10, vykonajú sa príkazy tesne pod inštrukciou "JNZ podmienka1FALSE" a následne sa skočí na koniec cyklu, aby sa nevykonali aj príkazy, ktoré patria ELSE vetve.

V prípade, že nám stačí IF-THEN verzia, použijeme tento kód:

podmienka2:
CMP hodnota,10			;if (hodnota==10)
JNZ podmienka2koniec		
...				;{
...				;hodnota==10
...				;}
podmienka2koniec