94 10. Arytmetyka mikrokontrolcrói
94 10. Arytmetyka mikrokontrolcrói
Roznica_30_40: MOV |
R1,#41H |
;R1 <— 41H, |
adresuje mniej znaczący |
MOV |
A,31H |
9 ;A (31H), |
bajt drugiej zmiennej przesłanie mniej znaczącego |
CLR |
C |
9 ;C <— 0, |
bajtu pierwszej zmiennej zerowanie znacznika C |
SUBB |
A,@R1 |
;A<~ A-C- |
(Rl) |
MOV |
@R1,A |
;(R1) <r- A, |
przesłanie mniej znaczącego |
DEC |
R1 |
/ ;R1 R1 -1, |
bajtu różnicy Rl = 40H |
MOV |
A,30H |
;A <- (30H), |
przesłanie bardziej znaczącego |
SUBB |
A,@R1 |
9 ;A A - C - |
bajtu pierwszej zmiennej (Rl) |
MOV |
@R1,A |
;(R1)<-A, |
przesłanie bardziej znaczącego |
/ |
bajtu różnicy |
W instrukcjach odejmowania, podobnie jak w instrukcjach dodawa znajdują się instrukcje odejmowania 1, zmniejszania o 1 (dekrcmenta zawartości rejestru lub komórki wewnętrznej pamięci RAM:
DEC |
A |
;A <- A - 1 |
DEC |
Rn |
;Rn <— Rn - 1 |
DEC |
adr |
;(adr) <— (adr) - 1 |
DEC |
@Ri |
;(Ri) <- (Ri) - 1 |
Instrukcje DEC nie zmieniają znaczników w rejestrze statusowym PSW,: wyjątkiem znacznika P jeśli instrukcja zmienia stan akumulatora A.
Zmniejszenie o jeden zawartości 8-bitowego rejestru lub komórki wewnętrzi pamięci RAM wykonywane jest modulo 8 bitów:
Dec_Rl:
MOV |
R1,#0 |
;R1 i-0 |
DEC |
Rl |
;R1 4— Rl -1, Rl = OFFh |
W instrukcjach |
odejmowania jedności brak jest dekrementacji | |
wskaźnikowego rejestru danych DPTR. Operację tę można na przykład | ||
zrealizować |
wykonując |
instrukcje: |
CLR |
C |
;C <— 0 |
MOV |
A,DPL |
;A <- DPL, dekrementacja rejestru DPL i |
SUBB |
A,#l |
;A i- A - C - 1 |
MOV |
DPL,A |
;DPL <t- A |
MOV |
A,DPI I |
;A DPH |
SUBB |
A,#0 |
;A <- A - C 0, jeśli wystąpiła pożyczka (C D ; to dekrementacja rejestru DPfl |
MOV |
DPH,A |
;DPH A |
Przy adresowaniu tablic w pamięci programu ROM lub zewnętrznej pamięci danych RAM za pośrednictwem wskaźnikowego rejestru danych DPTR należy pamiętać aby adresy kolejnych komórek pamięci narastały, a nie malały. Jest to ważne ponieważ jest instrukcja inkrementacji wskaźnikowego rejestru danych DPTR (INC DPTR) ale brak jest dekrementacji tego rejestru
Z instrukcjami odejmowania związane są rozkazy DJNZ (Decrement and Jump relative if Not Zero) będące połączeniem dekrementacji (zmniejszania o 1) i skoku warunkowego:
DJNZ Rn,rel ;Rn <- Rn - 1
;jeśli Rn * 0 to skocz do PC+rei DJNZ adr,rei ;(adr) <- (adr) - 1
;jeśli (adr) * 0 to skocz do PC+rel
które stosowane są przeważnie przy powtórzeniach programu nie przekraczających 256 razy. Instrukcje DJNZ wykonywane są wr dwóch etapach:
• zmniejszenie o jeden pierwszego argumentu, tj. zawartości rejestru Rn (R0.. R7) lub komórki wewnętrznej pamięci RAM adresowanej bezpośrednio, także rejestrów' specjalnych SFR (które adresowane są tylko bezpośrednio),
• wykonanie skoku do adresu będącego sumą zawartości licznika rozkazów PC (wskazuje zawsze pierwszy bajt następnej do wykonania instrukcji) i liczby (przesunięcia) rei. Liczba rei traktowana jest jako 8-bitowa liczba całkowita ze znakiem.
Pierwszy z argumentów (rejestr Rn lub komórka pamięci adresowana bezpośrednio o adresie adr) w powtórzeniach programu pełni rolę licznika powtórzeń.
Zamiast mozolnie obliczać przesunięcie rei stanowiące drugi z argumentów instrukcji DJNZ w praktyce podaje się odpowiednie etykiety, adresy instrukcji, do których ma wystąpić skok. Właściwą wartość przesunięcia rei oblicza asembler w' trakcie asemblacji programu:
MOV R7,#4 ;rejestr R7 pełni rolę licznika powtórzeń
Skok: XRL Pl,#0FFh ;P1 <— PI, początek pętli programu
DJNZ R7,Skok ;R7 <- R7 -1
;jeśli R7 * 0 to skok do etykiety Skok
Dalej: ................ ;dalsza część programu
Podany program 4-krotnie neguje stan linii portu PI. Ponieważ przesunięcie rei = Skok - Dalej jest liczbą całkowńtą ze znakiem, dlatego adres skoku może