98 10. Ary tmetyka 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. Ary tmetyka mikrokontrolerów
Tutaj:
Mały:
A,#2Eh,Tutaj
Mały
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 zmienny< 8-bitowych, z których jedna znajduje się w akumulatorze A, a druga w rejesti B. Wynik wykonanej operacji przesyłany jest do rejestru B (8 bardzie znaczących bitów wyniku) i akumulatora A (8 mniej znaczących bitó\ 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. Instrukc mnożenia należy do najdłużej (wraz z instrukcja dzielenia) wykonywanyc 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
MOV
MUL
A, #18d ;A <-18, dziesiętnie,
B, #29d ;B <- 29, dziesiętnie
AB ;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żei przez 4 liczby przechowywanej w rejestrze R4:
MOV A,R4
;A <— R4
CLR |
C |
O t o |
RLC |
A |
;przesunięcie akumulatora A w lewo |
RLĆ |
A |
;przesunięcie akumulatora A w lewo |
MOV |
R4,A |
;R4 <- A |
yV 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 <- 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 = l
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 <- 5Fh, zamieniana liczba w kodzie ; szesnastkowym, |
MOV |
B,#l() |
;B <-10 |
DIV |
AB |
;A <- Int(5Fh/10) = 9 jest liczbą dziesiątek, ;B <- Mod(5Fh/10) = 5 jest liczbą jedności |