98 10. Arytmetyka mikrokontrolerów
rozpoczynającego się od etykiety Duży jeśli A > 2Eh, a jeśli A £ 2Eh to do programu rozpoczynającego się etykietą Mały:
98 10. Arytmetyka mikrokontrolerów
Tutaj:
Mały:
CJNE A,#2Eh,Tutaj JC Mały
JNZ Duży
;jeśli A > 2Eh to C=0 ;skok jeśli C=1 ;skok jeśli A * 0
Operacja mnożenia MUL AB wykonuje mnożenie dwóch zmiennych 8-bitowych, z których jedna znajduje się w akumulatorze A, a druga w rejestrze B. Wynik wykonanej operacji przesyłany jest do rejestru B (8 bardziej znaczących bitów wyniku) i akumulatora A (8 mniej znaczących bitów wyniku):
MUL AB ;BA <— A ♦ B
Znacznik przeniesienia C i nadmiaru OV przyjmują następujące wartości:
C = 0 zawsze
OV = 1
jeśli iloczyn jest liczbą większą od 255, tzn. zawartość rejestru B
jest niezerowa;
OV 0
jeśli warunek nie jest spełniony.
Obie zmienne traktowane są jako liczby całkowite bez znaku. Instrukcja mnożenia należy do najdłużej (wraz z instrukcja dzielenia) wykonywanych instrukcji. Trwa 4 cykle maszynowe.
Mnożenie dwóch stałych o wartościach 18 i 29 realizowane jest następująco:
Mul AB:
MOV A,#18d MOV B,#29d MUL AB
A <— 18, dziesiętnie,
B <- 29, dziesiętnie
BA <- A * B, 18 * 29 = 522 = 20Ah stan rejestrów: A = OAh,
B = 2,
i znaczników: C = 0 (zawsze zerowany),
OV = 1, ponieważ B * 0 P = 0
Jeżeli operacje mnożenia dotyczą potęgi 2 (np. 2k), to można je zastąpi rozkazami k-krotnego przesunięcia logicznego w lewo, np. przy mnożeni0 przez 4 liczby przechowywanej w rejestrze R4:
CLR |
C |
;C 4- 0 |
RLC |
A |
;przesunięcie akumulatora A w lewo |
Rl (' |
A |
przesunięcie akumulatora A w lewo |
MOV |
R4,A |
;R4 <- A |
W podanym przykładzie nie jest wykrywane i sygnalizowane przekroczenie zakresu liczby. Jeśli nie jest się pewnym zakresu mnożonej liczby, to bezpieczniejsze jest użycie instrukcji MUL AB.
Podobna w działaniu do rozkazu RLC A jest instrukcjia RL A, która także przesuwa w lewo zawartość akumulatora A ale w obrębie 8-bitów, a nie 9-bitów. Graficzne obie instrukcje przedstawić można w następujący sposób:
RL A
RLC A
Instrukcja dzielenia DIV AB wykonuje dzielenie 8-bitowej zmiennej znajdującej się w akumulatorze A przez zmienną 8-bitową znajdującą się w rejestrze B. Część całkowita ilorazu przesyłana jest do akumulatora A, a reszta z dzielenia do rejestru B:
DIV AB ;A 4— Int( A/B), iloraz
;B <— Mod( A/B ), reszta
Znacznik przeniesienia C i nadmiaru OV przyjmują następujące wartości:
C = 0 zawsze
OV = 1
OV = 0
w przypadku próby dzielenia przez zero, stan rejestrów A i B
jest nieokreślony,
jeśli dzielenie przebiegło prawidłowo
Obie zmienne traktowane są jako liczby całkowite bez znaku, a instrukcja wykonywana jest w ciągu 4 cykli maszynowych.
Przy zamianie 1-bajtowej liczby zapisanej w kodzie szesnastkowym z przedziału 0 .. 99 na liczbę zapisaną w kodzie BCD wykonywane są instrukcje:
Hex_BCD_99:
MOV |
A,#5Fh |
;A 4- 5Fh, zamieniana liczba w kodzie ; szesnastkowym, |
MOV |
B,#10 |
;B 4-10 |
D1V |
AB |
;A 4- Int(5Fh/10) - 9 jest liczbą dziesiątek, ;B 4- Mod(5Fh/10) = 5 jest liczbą jedności |