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