Assembleur 80x86 | XADD |
---|---|
INTEL 80486+, x86-64 | eXchange ADDition |
Syntaxe
XADD dest, source |
Paramètres
Nom | Description |
---|---|
dest | Ce paramètre permet d'indiquer l'opérande recevant le résultat |
source | Ce paramètre permet d'indiquer l'opérande à ajouter au résultat et recevant le résultat original |
Description
Cette instruction permet d'échanger le premier opérande avec le deuxième opérande, et ensuite effectue la somme des valeurs dans le première opérande.
Remarques
- 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.
- L'instruction XADD peut être utilisée avec un préfixe LOCK pour permettre l'exécution de l'instruction de manière atomique.
Algorithme
MODULE XADD(dest, source) Temporary ← dest dest ← dest + source source ← Temporary |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
XADD reg/mem8, reg8 | 0Fh C0h /r | Echange le contenu d'un registre 8 bits avec le contenu d'une opérande mémoire ou registre 8 bits et charge la somme dans la destination. |
XADD reg/mem16, reg16 | 0Fh C1h /r | Echange le contenu d'un registre 16 bits avec le contenu d'une opérande mémoire ou registre 16 bits et charge la somme dans la destination. |
XADD reg/mem32, reg32 | 0Fh C1h /r | Echange le contenu d'un registre 32 bits avec le contenu d'une opérande mémoire ou registre 32 bits et charge la somme dans la destination. |
XADD reg/mem64, reg64 | 0Fh C1h /r | Echange le contenu d'un registre 64 bits avec le contenu d'une opérande mémoire ou registre 64 bits et charge la somme dans la destination. |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg,reg | - | - | - | 3 | 2 |
mem,reg | - | - | - | 4 | 2 à 4 |
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 le registre DL avec AH et d'effectuer une addition :
- XADD DL,AH
L'exemple suivant permet d'échanger l'octet de l'emplacement mémoire avec AL et d'effectuer une addition :
- XADD [EDX+112],AL
L'exemple suivant permet d'échanger le registre AX avec DX et d'effectuer une addition :
- XADD AX,DX
L'exemple suivant permet d'échanger un mot de l'emplacement mémoire avec DX et d'effectuer une addition :
- XADD [EAX+10],DX
L'exemple suivant permet d'échanger le registre EAX avec EDX et d'effectuer une addition :
- XADD EDX,EAX
L'exemple suivant permet d'échanger le registre EDI avec l'adresse indiquer mémoire ESI et d'effectuer une addition :
- XADD [ESI],EDI
Voir également
Instruction assembleur 80x86 - Instruction BSWAP
Instruction assembleur 80x86 - Instruction XCHG
Références
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 535 à 537.