Konštrukcia IF-ELSE (assembler): Rozdiel medzi revíziami
(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…“) |
|||
| Riadok 1: | Riadok 1: | ||
[[Kategória :Konfigurovateľné mikroprocesorové systémy]] | [[Kategória :Konfigurovateľné mikroprocesorové systémy]] | ||
| − | |||
| − | Konštrukciu IF-ELSE používame vtedy, keď je vykonanie časti programu závislé na podmienke. Praktickým použitím je | + | 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: | |
| − | + | <source lang="c"> | |
| − | + | If (podmienka) Then | |
| − | + | (ak je podmienka splnena) | |
| − | + | Else | |
| − | + | (ak je podmienka nesplnena) | |
| − | + | End If | |
| − | + | </source> | |
| − | |||
| − | |||
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: | ||
| − | + | <source lang="c"> | |
| − | + | if (podmienka) { | |
| − | + | (ak je podmienka splnená) | |
| − | + | }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. |
| − | |||
<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 | |
| − | + | 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 | ||
| + | </source> | ||
Praktický príklad porovnania, či hodnota == 10 vyzerá takto. | Praktický príklad porovnania, či hodnota == 10 vyzerá takto. | ||
| − | + | <source lang="asm"> | |
| − | + | podmienka1: | |
| − | + | CMP hodnota,10 ;if (hodnota==10) | |
| − | + | JNZ podmienka1FALSE | |
| − | + | ... ;{ | |
| − | + | ... ;hodnota==10 | |
| − | + | ... ;} | |
| − | + | JMP podmienka1koniec | |
| − | + | podmienka1FALSE: ;else | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | hodnota | + | ... ;{ |
| + | ... ;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: | ||
| − | + | <source lang="asm"> | |
| − | + | podmienka2: | |
| − | + | CMP hodnota,10 ;if (hodnota==10) | |
| − | + | JNZ podmienka2koniec | |
| − | + | ... ;{ | |
| − | + | ... ;hodnota==10 | |
| − | + | ... ;} | |
| + | podmienka2koniec | ||
| + | </source> | ||
Verzia zo dňa a času 13:28, 8. február 2011
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