Laboratorium Techniki Mikroprocesorowej 2 - EZ1C600 034
mniejsze’. Rozwiązaniem alternatywnym dla użycia rozkazu CP jest wykonanie odejmowania:
SUB B
Potrzebne do rozróżnienia wyniku porównania flagi CY oraz Z ustawiają się identycznie, jedynie zmienia się zawartość akumulatora A - przyjmuje on wartość różnicy porównywanych liczb. Taka utrata wartości jednego z argumentów może być niekorzystna, jeżeli mielibyśmy ją porównywać jeszcze z innymi zmiennymi.
Jeżeli w programie wykorzystujemy liczby dłuższe niż słowo maszynowe procesora (w przypadku eZ80 dłuższe niż 8 bitów) ich porównanie także jest możliwe. Uniwersalną metodą w takim przypadku jest policzenie różnicy tych liczb. Różnicę liczb wielobajtowych liczy się rozpoczynając odejmowanie od najmłodszych par bajtów, a kończąc na bajtach najbardziej znaczących. Stan flagi przeniesienia na koniec tych operacji informuje nas o relacji pomiędzy odejmowanymi liczbami. Jeżeli w przypadku mikroprocesora eZ80 porównywane liczby są dwubajtowe można też rozważyć użycie rozkazu odejmowania dwubajtowego:
varl:equ lOOh /przykład deklaracji adresów
var2: equ var2+2 /zmiennych programowych
LD HL,(varl) /HL<-2-bajtowa wartość zmiennej varl
LD DE,(var2) /DE<-2-bajtowa wartość zmiennej var2
CLR C /wstępne zerowanie CY
SBC HL,DE /CY:=0 <=> HL<DE
JP NC,varlmniejsza /skok
Wstępne zerowanie flagi przeniesienia rozkazem CY jest tu niezbędne, ponieważ rozkaz SBC jest odejmowaniem z pożyczką i wykonanie go przy ustawionej fladze CY dawałoby niepoprawny wynik porównania.
Użycie bloku decyzyjnego o trzech wyjściach oznacza odpowiednie wykorzystanie przez skoki warunkowe flag przeniesienia CY i zera Z. Przykładowo, schematowi blokowemu:
<o i >o
zm1-zm2
=oi ^
odpowiadałby następujący fragment programu:
LD A, (zm2)
LD B, A
LD A, (zml)
CP B
JR Z,równe /skok gdy zml=zm2
JR C,mniejsze /skok gdy zml<zm2
/ tu jeśli zml>zm2
LD |
BC, (varl) |
/BC<-2-bajtowa wartość zmiennej varl |
LD |
DE,(var2) |
/DE<-2-bajtowa wartość zmiennej var2 |
LD |
A, C | |
CP |
E | |
JR |
NZ,rożne |
/skok gdy bajty się różnią |
LD |
A, B | |
CP |
D | |
JR |
NZ,rożne |
/skok gdy bajty się różnią |
;tu jeśli varl=var2
Rozkaz ‘cp B’ mógłby być zamieniony parą rozkazów ‘clr c’ i ‘sub b’. Jeżeli należy jedynie wykryć równość dwóch wartości (zmiennych) o dłuższej niż słowo maszynowe procesora reprezentacji, można to zrobić następująco:
1-11