Konštrukcia IF-ELSE (assembler)

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
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