100 10. Arytmetyka mikrokontrolerów!
Jeżeli operacje dzielenia dotyczą potęgi 2 (np. 2k), to można je zastąpić' rozkazami k-krotnego przesunięcia logicznego w prawo. Należy przy tymi przeanalizować, która metoda da krótszy kod wynikowy lub która będzie j szybsza. Równie ważnym zagadnieniem jest przy operacjach przesuwania logicznego odtworzenie znaku przesuwanej liczby. Bit najbardziej znaczący (MSB) jest znakiem liczby w kodzie uzupełnienia do 2 , np:
MOV C,ACC.7 RRC A
;C <- ACC.7, odtworzenie znaku liczby ; MSB = ACC.7
;przesunięcie akumulatora A w prawo
W przykładzie wykorzystano instrukcję RRC A, która ma (podobnie jak instrukcja przesuwania w lewo RLC A) skróconą wersję przesuwania w prawo RR A. Różnica między obu rozkazami polega na tym, że rozkaz RR C przesuwa tylko zawartość akumulatora A, a rozkaz RRC A przesuwa zawartość akumulatora A z uwzględnieniem dodatkowego 9 bitu, którym jest znacznik przeniesienia C:
RR A
c
a7
Ostatnią rozważaną instrukcją arytmetyczną jest instrukcja korekcji dziesiętnej DA A. Stosowana jest w operacjach dodawania liczb zapisanych w kodzie BCD, po instrukcji ADD lub ADDC. Jeśli w wyniku dodawania:
• wartość 4 mniej znaczących bitów akumulatora A? 0 > 9 lub znacznik przeniesienia połówkowego AC = 1 to:
-> A = A + 6, do akumulatora A następuje dodanie wartości Dodawanie może ustawić znacznik przeniesienia C (C=l) ale n*e może go wyzerować, tzn. C=0,
• wartość 4 bardziej znaczących bitów akumulatora A7 4 > 9 lub znaczni przeniesienia C = 1 to:
-> A - A + 60h, do akumulatora A następuje dodanie wartości 60h
dodawanie może ustawić znacznik przeniesienia C (C=l) ale może go wyzerować, tzn. C=0.
Instrukcja DA A nic może być stosowana do bezpośredniej zamiany liczby zapisanej w kodzie binarnym na liczbę zapisaną w kodzie BCD.
Taka zamiana może być tylko wynikiem odpowiednio przygotowanego programu, który przedstawiony jest w |3j.
Sposób wykorzystania instrukcji korekcji dziesiętnej przedstawia poniższy przykład, w którym występuje dodawanie dwóch zmiennych 2-bajtowych zapisanych w kodzie BCD i zawartych w wewnętrznej pamięci RAM:
pierwsza zmienna w komórce wewnętrznej pamięci RAM:
Adres_Dana .1 - adres bajtu mniej znaczącego,
Adres_Dana_l+l - adres bajtu bardziej znaczącego,
295 BCD - wartość dziesiętna zmiennej zapisanej w kodzie BCD,
druga zmienna w komórce wewnętrznej pamięci RAM:
Adres_Dana_2 - adres bajtu mniej znaczącego,
Adres Dana_2+l - adres bajtu bardziej znaczącego,
685 BCD - wartość dziesiętna zmiennej zapisanej w kodzie BCD,
Suma BCD: MOV |
R0,#Adres Dana_l |
;R0 adresuje pierwszą zmienną |
MOV |
Rl,#Adres Dana 2 |
;R1 adresuje drugą zmienną i wynik |
MOV |
R2,#2 |
;R2 jest licznikiem dodawanych bajtów |
CLR |
C | |
Pla: MOV |
A,@R0 |
;pobranie pierwszego argumentu |
ADDC |
A,@R1 |
;dodawanie z drugim argumentem |
DA |
A |
;korekcja dziesiętna |
MOV |
@R1,A |
;przesłanie wyniku dodawania |
INC |
R0 |
przygotowanie do dodawania |
INC |
R1 |
;kolejnych bajtów obu zmiennych |
DJNZ |
R2,Pla |
powtórzenie pętli dodawania |
Dalej: |
;dalsza część programu użytkownika |
Wartości poszczególnych rejestrów w trakcie wykonywania programu są
Ustępujące:
C = 0
(Adres Dana 1) = 95h = 1001 OlOlb dodawanie mniej znaczących
---(Adres Dana_2) = 85h = 1000 OlOlb bajtów
Suma: A = 1 Ah = 0001 lOlOb C = 1, A7 4 < 9, AC = 0,AjO>9
jeśli Aj () > 9 lub AC=1 to dodanie 6
.^J^rekcja dziesiętna A, 0 : 0000 01 lOb
Suma: A = 20h = 0010 OOOOb nie zmienia C, C=1 !
jeśli: A7 4 > 9 lub C=1 to dodanie 60h