Assembleur 80x86 | CMP |
---|---|
INTEL 8088+, x86-64 | Compare two operands |
Syntaxe
CMP Opérande Cible, Opérande Source |
Paramètres
Nom | Description |
---|---|
Opérande Cible | Ce paramètre permet d'indiquer l'opérande de base sur lequel l'opération de comparaison est effectuée. |
Opérande Source | Ce paramètre permet d'indiquer l'opérande supplémentaire avec laquelle la comparaison est effectué |
Description
Cette instruction offre la possibilité essentielle de comparer 2 registres ou emplacements de mémoire. Le résultat de la comparaison est indiqué par les indicateurs (registre drapeau du microprocesseur). La comparaison est effectuée en soustrayant le deuxième opérande (Opérande Source) du premier opérande (Opérande Cible), puis en plaçant les indicateurs d'état de la même manière que l'instruction SUB. Lorsqu'une valeur immédiate est utilisée en tant qu'opérande, elle est étendue à la longueur du premier opérande.
Remarques
- Les codes de condition utilisés par les instructions Jcc, CMOVcc et SETcc sont basés sur les résultats d'une instruction CMP.
- En mode 64 bits, la taille de fonctionnement par défaut de l'instruction est de 32 bits. L'utilisation du préfixe REX.R permet d'accéder à des registres supplémentaires (R8 à R15). L'utilisation du préfixe REX.W favorise le fonctionnement à 64 bits.
- Les drapeaux AF, CF, OF, PF, SF et ZF du registre de drapeaux sont effectués par cette instruction.
Algorithme
MODULE CMP(opérande1,opérande2) Drapeau ← opérande1 = opérande2 |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
CMP AL, imm8 | 3Ch ib | Compare une valeur 8 bits immédiate avec le contenu du registre AL. |
CMP AX, imm16 | 3Dh iw | Compare une valeur 16 bits immédiate avec le contenu du registre AX. |
CMP EAX, imm32 | 3Dh iw | Compare une valeur 32 bits immédiate avec le contenu du registre EAX. |
CMP RAX, imm32 | 3Dh id | Compare une valeur 32 bits immédiate avec le contenu du registre RAX. |
CMP reg/mem8, imm8 | 80h /7 ib | Compare une valeur 8 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 8 bits. |
CMP reg/mem16, imm16 | 81h /7 iw | Compare une valeur 16 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 16 bits. |
CMP reg/mem32, imm32 | 81h /7 id | Compare une valeur 32 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 32 bits. |
CMP reg/mem64, imm32 | 81h /7 id | Compare une valeur 32 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 64 bits. |
CMP reg/mem16, imm8 | 83h /7 ib | Compare une valeur 8 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 16 bits. |
CMP reg/mem32, imm8 | 83h /7 ib | Compare une valeur 8 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 32 bits. |
CMP reg/mem64, imm8 | 83h /7 ib | Compare une valeur 8 bits immédiate avec le contenu d'une opérande mémoire ou d'un registre 64 bits. |
CMP reg/mem8, reg8 | 38h /r | Compare le contenu d'une opérande mémoire ou d'un registre 8 bits avec un registre 8 bits. |
CMP reg/mem16, reg16 | 39h /r | Compare le contenu d'une opérande mémoire ou d'un registre 16 bits avec un registre 16 bits. |
CMP reg/mem32, reg32 | 39h /r | Compare le contenu d'une opérande mémoire ou d'un registre 32 bits avec un registre 32 bits. |
CMP reg/mem64, reg64 | 39h /r | Compare le contenu d'une opérande mémoire ou d'un registre 64 bits avec un registre 64 bits. |
CMP reg8, reg/mem8 | 39h /r | Compare le contenu d'une opérande mémoire ou d'un registre 8 bits avec un registre 8 bits. |
CMP reg16, reg/mem16 | 3Bh /r | Compare le contenu d'une opérande mémoire ou d'un registre 16 bits avec un registre 16 bits. |
CMP reg32, reg/mem32 | 3Bh /r | Compare le contenu d'une opérande mémoire ou d'un registre 32 bits avec un registre 32 bits. |
CMP reg64, reg/mem64 | 3Bh /r | Compare le contenu d'une opérande mémoire ou d'un registre 64 bits avec un registre 64 bits. |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg,reg | 3 | 2 | 2 | 1 | 2 |
mem,reg | 9+EA | 7 | 5 | 2 | 2 à 4 |
reg,mem | 9+EA | 6 | 6 | 2 | 2 à 4 |
mem,immed | 10+EA | 6 | 5 | 2 | 3 à 6 |
reg,immed | 4 | 3 | 2 | 1 | 3 à 4 |
accum,immed | 4 | 3 | 2 | 1 | 2 à 3 |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#SS(Pile) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#GP(Protection général) | X | X | X | Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique |
X | Un segment de données nulle est utilisé comme référence mémoire | |||
#PF(Faute de page) | X | X | Une faute de page résultat de l'exécution de l'instruction | |
#AC(Vérifie l'alignement) | X | X | Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé |
Exemples
L'exemple suivant permet de comparer le registre EAX avec la valeur 0 :
- CMP EAX,0
L'exemple suivant permet de comparer le registre CL avec le registre BL :
- CMP CL,BL
L'exemple suivant permet d'effectuer le calcul de «AX-2000h» et de mettre les drapeaux à jour :
- CMP AX,2000h
L'exemple suivant permet de soustraire CH du contenu en octets du segment de données adressé par DI et les drapeaux sont mis à jour :
- CMP [DI],CH
Le contenu en octets de l'emplacement de mémoire de données 1234h est soustrait du registre AH et les drapeaux sont mis à jour :
- CMP AH,[1234h]
L'exemple suivant permet de comparer le registre AX avec le registre BX :
- CMP AX,BX
L'exemple suivant permet de comparer le registre EAX avec le registre EBX :
- CMP EAX,EBX
L'exemple suivant permet de comparer le registre RAX avec le registre RBX :
- CMP RAX,RBX
L'exemple suivant permet de comparer le registre EAX avec un emplacement mémoire absolue :
- CMP EAX,[01234ABC]
L'exemple suivant permet de comparer le registre EAX avec la valeur d'un symbole :
- CMP EAX,UnSymbole
L'exemple suivant permet de comparer le registre EAX avec l'adresse mémoire d'un symbole :
- CMP EAX,[UnSymbole]
L'exemple suivant permet de comparer le registre EAX avec la valeur 0 et de sauter à l'étiquette suivante si la valeur n'est pas zéro :
L'exemple suivant permet de retourner 1 si le caractère spécifié par la variable «Chr» est une lettre de l'alphabet (majuscule ou minuscule) ou 0 s'il ne l'est pas :
Voir également
Instruction assembleur 80x86 - Instruction SUB
Instruction assembleur 80x86 - Instruction CMPS
Instruction assembleur 80x86 - Instruction SCAS
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 808
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 403
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 94 à 96.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 206 à 208.