96 10. Arytmetyka mikrokontrolerów
różnić się więcej niż o -128 .. +127 w stosunku do adresu następnego rozkazuj występującego po instrukcji DJNZ. W podanym przykładzie różnica adresów) (etykiet) nie może przekraczać wartości:
-128 < Skok-Dalej < 127
Jeśli stosowany debuger nie wyświetla użytych w asemblerze symboli, J podany program rozpoczyna się np. od adresu OlAOh, to po uruchomieniu debugera na ekranie komputera może pojawić się zapis:
pamięć kodu programu |
postać symbolicz |
na programu: | ||
adres: |
zawartość: | |||
OlAOh |
7Fh 04h |
MOV |
R7,#4 | |
01 A2h |
63h 90h OFFh |
Skok: |
XRL |
Pl,#0FFh |
01 A5h 01A7h |
ODFh OFBh |
Dalej |
DJNZ |
R7,Skok |
Asembler obliczył różnicę adresów Skok |
- Dalej = |
OFBh i podstawił ją |
jako drugi argument instrukcji DJNZ R7,0FBh.
Jeśli podany w instrukcji DJNZ warunek (Rn * 0 lub (adr) * 0 ) nie jest spełniony, to mikrokontroler wykonuje następną instrukcję programu.
Instrukcje DJNZ nie wpływają na stan znaczników słowa statusowego I PSW, z wyjątkiem instrukcji DJNZ ACC,rel.
Maksymalna liczba powtórzeń pętli programu z użyciem instrukcji DJNZ wynosi 256. Aby to uzyskać należy wpisać do rejestru licznikowego warto# początkową równą 0, ponieważ jako pierwsze wykonywane je$t odejmowanie 1, a później porównanie.
W wielu pętlach programu służących do odmierzania odcinków czasu wykorzystywana jest instrukcja NOP, np:
MOV R7,#0 ;rejestr R7 jest licznikiem pętli
Skok: NOP ;1 cykl maszyn.
DJNZ R7,Skok ;2 cykle maszyn.
Instrukcja NOP trwa jeden cykl maszynowy i w tym czasie procesor nie zmiel zawartości żadnego z rejestrów lub komórek pamięci. Czas wykonywania p?1 programu wynosi 256 * (1+2) = 768 cykli maszynowych.
Porównanie dwóch argumentów’ prowadzi zwykle do rozgałęziei programu, czyli skoku do fragmentu programu jeśli wynikiem porównania j<
prawda lub realizacja dalszej części programu jeśli wynikiem porównania jest fałsz- Wynika z tego, że wykonywane są równocześnie dwie operacje: porównania i skoku warunkowego. Konstruktorzy mikrokontrolera 8051 i wszystkich następnych tej rodziny przewidzieli taką sytuację. W liście rozkazów znalazły się rozkazy pełniące podane funkcje oznaczone symbolem CJNE (Compare and Jump relative if Not Equal):
CJNE A,adr,rel CJNE A,#dana,rel CJNE Rn,#dana,rel CJNE @Ri,#dana,rel
;jcśli A1(adr) to skocz do PC+rel ;jeśli A1dana to skocz do PC+rel ;jeśli Rn1dana to skocz do PC+rel ;jeśli (Ri)1dana to skocz do PC+rel
We wszystkich rozkazach CJNE zmieniany jest znacznik przeniesienia C
w następujący sposób:
• jeśli Argument_l < Argument_2 to C=l,
• jeśli Argument_l > Argument_2 to C=0,
• Argumentem 1 jest: A, Rn (R0 .. R7) lub Ri (R0, Rl),
• Argumentem 2 jest: adr (komórka wewnętrznej pamięci RAM adresowana bezpośrednio albo rejestry specjalne SFR) lub 8-bitowa dana będąca drugim bajtem instrukcji.
Rozkazy CJNE umożliwiają w bezpośredni sposób wykonanie skoku jeśli oba argumenty są różne. Poniższe przykłady wskazują jak wykonać porównanie i skok w przypadku gdy:
• Argument_l < Argument_2, np. przy porównaniu zawartości akumulatora A i rejestru B należy wykonać skok do programu rozpoczynającego się od etykiety (adresu) Wykonaj jeśli A < B, a jeśli A > B to do programu rozpoczynającego się etykietą Dalej:
CJNE A,B,Tutaj ;jeśli A < B to C=1
Tutaj: JC Wykonaj ;skok jeśli C=1
Dalej:
• ArgumenM > Argument 2, np. przy porównaniu zawartości rejestru R0 i zmiennej 3Ch należy wykonać skok do programu rozpoczynającego się od etykiety Skok_l jeśli R0 > 3Ch, a jeśli R0 < 3Ch to do programu rozpoczynającego się etykietą Skok 2:
CJNE R0,#3Ch,Tutaj ;jeśli R0 > 3Ch to C=0
Tutaj: JNC Skok 1 ;skok jeśli C=0
Skok_2: ....................
Argument_l > Argument 2, np. przy porównaniu zawartości akumulatora A i zmiennej 2Eh należy wykonać skok do programu