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) )
- Si A=N alors Z=1
- Si A!=N alors Z=0
- Si A<N alors C=1
- Si A>=N alors C=0
- Si A-N<0 alors S=1 (bit 7 du résultat copié dans S)
- Si A-N>=0 alors S=0
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
|
- Si HL=DE alors Z=1
- Si HL!=DE alors Z=0
- Si HL<DE alors C=1
- Si HL>=DE alors C=0
- Si HL-DE<0 alors S=1
- Si HL-DE>=0 alors S=0
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.
CPCrulez[Content Management System] v8.732-desktop/c Page créée en 285 millisecondes et consultée 7 foisL'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko. |
|