Assembleur 80x86 | XCHG |
---|---|
INTEL 8088+, x86-64 | Exchange |
Syntaxe
XCHG opérandecible1,opérandecible2 |
Description
Cette instruction permet d'échanger la valeur de deux opérandes. Les opérandes peuvent être 2 registres à usage général ou un registre et un emplacement de mémoire. Si un opérande de mémoire est référencé, le protocole de verrouillage du microprocesseur est automatiquement mis en oeuvre pour toute la durée de l'échange, que le préfixe LOCK ou le préfixe soit présent ou non.
Remarque
- Cette instruction est utile pour la mise en oeuvre de sémaphores ou de structures de données similaires pour la synchronisation de processus.
- L'instruction XCHG peut également être utilisée à la place de l'instruction BSWAP pour les opérandes de 16 bits.
- Mode Long : En mode 64 bits, la taille de fonctionnement par défaut de l'instruction est de 32 bits. L'utilisation d'un préfixe REX sous la forme REX.R permet d'accéder à des registres supplémentaires (R8 à R15). L'utilisation d'un préfixe REX sous la forme de REX.W favorise le fonctionnement à 64 bits.
Algorithme
MODULE XCHG(opérandecible1,opérandecible2) temp ← opérandecible1 opérandecible1 ← opérandecible2 opérandecible2 ← temp |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
XCHG AX, reg16 | 90h +rw | Échange le contenu du registre AX avec le contenu d'un registre 16 bits. |
XCHG reg16, AX | 90h +rw | Échange le contenu du registre 16 bits avec le contenu du registre AX. |
XCHG EAX, reg32 | 90h +rd | Échange le contenu du registre EAX avec le contenu d'un registre 32 bits. |
XCHG reg32, EAX | 90h +rd | Échange le contenu du registre 32 bits avec le contenu du registre EAX. |
XCHG RAX, reg64 | 90h +rq | Échange le contenu du registre RAX avec le contenu d'un registre 64 bits. |
XCHG reg/mem8, reg8 | 86h /r | Échange le contenu d'une opérande registre ou mémoire 8 bits avec le contenu d'un registre 8 bits. |
XCHG reg8, reg/mem8 | 86h /r | Échange le contenu d'un registre 8 bits avec le contenu d'une opérande registre ou mémoire 8 bits. |
XCHG reg/mem16, reg16 | 87h /r | Échange le contenu d'une opérande registre ou mémoire 16 bits avec le contenu d'un registre 16 bits. |
XCHG reg16, reg/mem16 | 87h /r | Échange le contenu d'un registre 16 bits avec le contenu d'une opérande registre ou mémoire 16 bits. |
XCHG reg/mem32, reg32 | 87h /r | Échange le contenu d'une opérande registre ou mémoire 32 bits avec le contenu d'un registre 32 bits. |
XCHG reg32, reg/mem32 | 87h /r | Échange le contenu d'un registre 32 bits avec le contenu d'une opérande registre ou mémoire 32 bits. |
XCHG reg/mem64, reg64 | 87h /r | Échange le contenu d'une opérande registre ou mémoire 64 bits avec le contenu d'un registre 64 bits. |
XCHG reg64, reg/mem64 | 87h /r | Échange le contenu d'un registre 64 bits avec le contenu d'une opérande registre ou mémoire 64 bits. |
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 | L'opérande de destination n'est pas dans un segment non écrivable | |||
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 d'échanger les valeurs du registre DL et AH :
- XCHG DL,AH
L'exemple suivant permet d'échanger les valeurs du registre AL et de l'emplacement mémoire d'un octet EDX+110 :
- XCHG AL,[EDX+110]
L'exemple suivant permet d'échanger les valeurs du registre AX et DX :
- XCHG AX,DX
L'exemple suivant permet d'échanger les valeurs du registre DX et de l'emplacement mémoire d'un mot EAX+20 :
- XCHG [EAX+20],DX
L'exemple suivant permet d'échanger les valeurs du registre EAX et EDX :
- XCHG EDX,EAX
L'exemple suivant permet d'échanger les valeurs du registre EDI et de l'emplacement mémoire de double mot ESI :
- XCHG [ESI],EDI
Voir également
Instruction assembleur 80x86 - Instruction BSWAP
Instruction assembleur 80x86 - Instruction XADD
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 839
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 418
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 245.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z, Edition Intel, Mars 2010, Publication No. 253667-034US, page 538 à 541.