We wszystkich strukturach programowych zachodzi potrzeba podejmowania decyzji. Wykorzystuje się tu instrukcje warunkowe. W asemblerze odpowiada to wykonaniu skoku warunkowego. W µK 8051 wszystkie skoki warunkowe są względne krótkie (offset).
Zestaw skoków warunkowych jest następujący:
Struktura stosowana, gdy zachodzi potrzeba warunkowego wykonania (lub pominięcia) pewnych operacji. Asembler (w porównaniu do języków wysokiego poziomu) ogranicza zestaw warunków możliwych do testowania. Ponadto zwykle sprawdzany jest warunek pominięcia operacji, a nie wykonania, jak to jest w językach np. C++ czy Pascal (zaznaczyłem to na sieci działań obok). |
Przykłady:
W poniższym przykładzie zostaną wykonane instrukcje XRL.. INC.. i SETB.. tylko dla minusa
do góryJest to rozgałęzienie programu na dwie równoległe ścieżki postępowania. Wymaga to wykonania w programie dwóch skoków, w tym jednego warunkowego. |
Przykłady:
Instrukcja CJNE posiada ciekawą właściwość, pozwalającą na rozgałęzienie potrójne według relacji "<", "=" i ">". Rozbudowana wersja powyższej konstrukcji:
do góryCzęsto występuje potrzeba wykonania różnych czynności, zależnie od zawartości jednego z rejestrów. Typowym przykładem jest obsługa kodów klawiatury traktowanej jako różnego typu polecenia sterujące. Np. w kalkulatorze inaczej obsługuje się naciśnięcie klawisza z cyfrą (0..9), przecinkiem(,), działaniem dwuargumentowym ( + - * / ), znakiem równości ( = ) itd. Rozbudowana struktura IF-ELSE-IF.. pozwala na rozpoznawanie dowolnych kodów jak również kodów błędnych (niepasujących do warunków). |
Przykład:
do góry
W mikrokontrolerze 51 występuje instrukcja skoku pod adres zależny od zawartości dwóch rejestrów: JMP @A+DPTR Daje ona możliwość realizacji bardzo eleganckiego rozwiązania rozgałęzienia zależnego od zawartości akumulatora: - w programie umieszczamy tablicę skoków dwubajtowych (typowo AJMP), - do rejestru DPTR wpisujemy adres początku tej tablicy, - w akumulatorze jest podwojony numer skoku. W porównaniu do poprzedniej struktury (IF-ELSE-IF..) jest to struktura bardziej regularna, szybciej wykonywana, czas wykonywania jest jednakowy dla różnych danych. Ilość rozgałęzień do 128. Jej wadą jest brak możliwości testowania zakresów danych, a jedynie pojedyńcze wartości. Oznacza to, że nie da się zrealizować warunku <, > i podobnych. |
Jeżeli do powyższej konstrukcji wykonamy skok ACALL lub LCALL, a procedury PROG0, PROG1 itd zakończymy rozkazem RET, to uzyskamy podprogram o działaniu zależnym od akumulatora.
do góry
Jest to pętla wykonywana "w nieskończoność". Najczęściej spotyka się ją jako główną pętlę programu, przy czym jej treść realizuje wszystkie czynności systemu (nie licząc przerwań). W rzeczywistości taka pętla (ale bardzo rozbudowana) występuje we wszystkich systemach operacyjnych. Stosuje się również pętlę pustą, która symuluje zatrzymanie pracy procesora. |
Przykłady:
do góry
Jest najczęściej stosowaną pętlą w programowaniu. Treść pętli zostanie wykonana tyle razy, ile wynosi wstępna zawartość rejestru pełniącego rolę licznika. W asemblerze licznik jest zwykle dekrementowany, co wynika z zastosowania bardzo wygodnej instrukcji skoku z predekrementacją:
DJNZ rejestr,offset Rejestry 8-bitowe umożliwiają realizację do 256 powtórzeń. W przypadku, gdy potrzebujemy większej stosujemy pętle zagnieżdżone. |
Przykłady:
do góry
Jest to pętla o nieokreślonej liczbie powtórzeń, przy czym jej treść może nie być wykonana ani razu. Przed jej rozpoczęciem należy ustalić wartości zmiennych testujących pętlę. Treść pętli powinna wpływać na zmienne wykorzystywane w wyrażeniu testującym jej zakończenie. |
Przykłady:
do góry
Jest to pętla o nieokreślonej liczbie powtórzeń, przy czym jej treść wykonywana jest co najmniej raz. Podobnie, jak w pętli WHILE jej treść powinna wpływać na zmienne wykorzystywane w wyrażeniu testującym jej zakończenie. Typowym zastosowaniem jest oczekiwanie na jakieś zdarzenie, np. na naciśnięcie określonego klawisza, zmiany stanu znacznika lub linii wejściowej, itp. |
Przykłady:
do góry