Revenir au plan du site


Instructions de comparaison


CP
L'instruction CP est en logique interne une soustraction du registre A qui ne met pas le registre A à jour. Seuls les flags sont positionnés en fonction du résultat de cette soustraction.

CP im8 ; comparer A avec la valeur immédiate im8
CP reg8 ; comparer A avec le registre 8 bits reg8
CP (HL) ; comparer A avec la valeur mémoire 8 bits à l'adresse HL
CP (IX+d) ; comparer A avec la valeur mémoire 8 bits à l'adresse IX+d
CP (IY+d) ; comparer A avec la valeur mémoire 8 bits à l'adresse IY+d

Interprétation des flags (avec N une valeur qui est reg8, im8 ou (reg16) )

Alternatives à l'instruction CP
Pour certaines comparaisons simples (-1, 0 ou 1) il est possible d'utiliser des instructions plus rapides dont l'usage premier n'est pas la comparaison mais pour lesquelles le Z80 va réaliser quelques tests.
OR A ; comparer à zéro, ne modifie pas le registre
INC A ; Si A vaut 1 alors le flag Z sera positionné. Le registre A est modifié
DEC A ; Si A vaut 255 alors le flag Z sera positionné. Le registre A est modifié
...

Comparaisons 16 bits
OR A ; efface la retenue sans modifier le registre A
SBC HL,DE ; Le registre HL est modifé par la soustraction avec retenue

CPI
Cette instruction est une instruction de comparaison groupée. L'instruction est équivalente au pseudo-code suivant :

CP (HL) ; compare le registre A avec la valeur 8bits à l'adresse HL
INC HL ; incrément HL
DEC BC ; décrémente BC
; certains flags sont modifiés par l'instruction

Si BC=0 après exécution de l'instruction, alors le flag P/V est mis à 0.

CPIR
Cette instruction est une répétition de l'instruction CPI tant que BC est plus grand que zéro ou que le registre A est différente de la valeur pointée par HL. Par exemple, pour trouver la première occurrence de A en mémoire, on peut écrire.

LD A,#55 ; valeur qu'on veut chercher
LD HL,montableau
LD BC,1024 ; taille maximum du tableau
CPIR
DEC HL ; pour avoir l'adresse de l'occurrence, il faut décrémenter HL car il est systématiquement incrémenté après chaque comparaison.

Après exécution le flag P/V est à 0 si on n'a trouvé aucune valeur OU que la valeur est la dernière du tableau. Il faut donc la tester!

CPD / CPDR
Ces instructions sont les versions de CPI/CPIR mais avec une décrémentation de HL pour effectuer une recherche dans l'ordre inverse de la mémoire.