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…“) |
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]] | ||
− | + | {{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. | ||
− | + | 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. |
− | + | <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> |
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