Konštrukcia IF-ELSE (assembler)
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