102 10. Arytmetyka mikrokontrolerów
Korekcja dziesiętna A7 Ą : 0110 OOOOb
Suma: A = 80h = 1000 OOOOb nie zmienia C, C=1 !
(Adres_Dana_2) <— A przesłanie sumy
C = 1 z poprzedniej korekcji
(Adres_Dana 1+1) = 2 = 0000 001 Ob dodawanie bardziej znaczących (Adres_Dana_2+l) = 6 = 0000 01 lOb bajtów
Suma: A = 9 = 0000 lOOlb C=0,A74<9, AOO, A30£9
brak korekcji dziesiętnej (Adres_Dana_2+l) <- A przesłanie sumy
Suma dwóch liczb zawarta w komórkach wewnętrznej pamięci RAM o adresie Adres_Dana_2 (mniej znaczący bajt sumy) i Adres Dana_2+1 (bardziej znaczący bajt sumy) jest równa 980 BCD. Należy pamiętać, że liczba ta zapisana jest w kodzie BCD.
Pytania i problemy
1. Czy prawdziwe są równości:
c) 1001 011 lb = -105 0 1000 OOOOb = -l
a) 100 = 64h b) 1001 Olllb = 150
d) 110 OOlo = 31h e) 1111 llllb =-128
2. W których instrukcjach arytmetycznych zmieniany jest i w jaki spos znacznik przeniesienia C?
3. Do czego służy znacznik nadmiaru OV ? Jaki jest sposób jego obliczania ?
4.
5.
6.
7.
8.
Jaka jest różnica między instrukcjami dodawania: ADD A,#l oraz INC A?
Czym różnią się instrukcje: ADD A,@R1 oraz ADDC A,@R1 ?
Jaka jest różnica między instrukcjami: SUBB A,#l oraz DEC A ?
Jak inaczej, niż to pokazano w przykładzie, wykonać dekrementa< wskaźnikowego rejestru danych DPTR ?
Ile maksymalnie bajtów może liczyć pętla programu objęta instruki DJNZ ? ’
9. Jak wykonać skok do programu po porównaniu dwóch argumentów jeśli oba argumenty są sobie równe ?
10. Jaka może być maksymalna różnica między adresem instrukcji CJNH i początku programu, do którego ma nastąpić skok ?
11. Jak sprawdzić prawidłowy przebieg dzielenia dwóch liczb 8-bitowych ?
12. Czy możliwe jest, używając bezpośrednio instrukcji mnożenia MUL AB, wykonać mnożenie dwóch 1-bajtowych liczb całkowitych ze znakiem ?
13. Co należałoby zrobić, aby wykonać dodawanie dwóch zmiennych 16-bitowych zapisanych w kodzie BCD ? Podać przykład programu.
14. Jak wykonać odejmowanie dwóch liczb dziesiętnych zapisanych w kodzie BCD ?