Assembleur 80x86 | XOR |
---|---|
INTEL 8088+, x86-64 | binary eXclusive OR |
Syntaxe
XOR OpérandeCible, OpérandeSource |
Description
L'instruction XOR effectue un OU exclusif BINAIRE sur les 2 opérandes spécifiés, le calcul est placé dans la première opérande, c'est-à-dire l'Opérande Cible. Rappelons qu'un OU exclusif BINAIRE donne le résultat 1 si une des 2 opérandes vaut 1 et donne 0 si les deux bits valent 0 ou 1.
Remarques
- L'instruction XOR peut être utilisée avec un préfixe LOCK pour permettre l'exécution de l'instruction de manière atomique.
- Mode Long : En mode 64 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 XOR(OpérandeCible, OpérandeSource) OpérandeCible ← OpérandeCible XOR OpérandeSource |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
XOR AL, imm8 | 34h ib | Effectue un «Ou exclusif binaire» du contenu du registre AL avec une valeur immédiate de 8 bits. |
XOR AX, imm16 | 35h iw | Effectue un «Ou exclusif binaire» du contenu du registre AX avec une valeur immédiate de 16 bits. |
XOR EAX, imm32 | 35h id | Effectue un «Ou exclusif binaire» du contenu du registre EAX avec une valeur immédiate de 32 bits. |
XOR RAX, imm32 | 35h id | Effectue un «Ou exclusif binaire» du contenu du registre RAX avec une valeur immédiate de 32 bits. |
XOR reg/mem8, imm8 | 80h /6 ib | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 8 bits avec une valeur immédiate de 8 bits. |
XOR reg/mem16, imm16 | 81h /6 iw | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 16 bits avec une valeur immédiate de 16 bits. |
XOR reg/mem32, imm32 | 81h /6 id | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 32 bits avec une valeur immédiate de 32 bits. |
XOR reg/mem64, imm32 | 81h /6 id | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 64 bits avec une valeur immédiate de 32 bits. |
XOR reg/mem16, imm8 | 83h /6 ib | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 16 bits avec une valeur immédiate de 8 bits. |
XOR reg/mem32, imm8 | 83h /6 ib | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 32 bits avec une valeur immédiate de 8 bits. |
XOR reg/mem64, imm8 | 83h /6 ib | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 64 bits avec une valeur immédiate de 8 bits. |
XOR reg/mem8, reg8 | 30h /r | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 8 bits avec le contenu d'un registre de 8 bits. |
XOR reg/mem16, reg16 | 31h /r | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 16 bits avec le contenu d'un registre de 16 bits. |
XOR reg/mem32, reg32 | 31h /r | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 32 bits avec le contenu d'un registre de 32 bits. |
XOR reg/mem64, reg64 | 31h /r | Effectue un «Ou exclusif binaire» du contenu d'une opérande mémoire ou registre 64 bits avec le contenu d'un registre de 64 bits. |
XOR reg8, reg/mem8 | 32h /r | Effectue un «Ou exclusif binaire» du contenu d'un registre de 8 bits avec le contenu d'une opérande mémoire ou registre 8 bits. |
XOR reg16, reg/mem16 | 33h /r | Effectue un «Ou exclusif binaire» du contenu d'un registre de 16 bits avec le contenu d'une opérande mémoire ou registre 16 bits. |
XOR reg32, reg/mem32 | 33h /r | Effectue un «Ou exclusif binaire» du contenu d'un registre de 32 bits avec le contenu d'une opérande mémoire ou registre 32 bits. |
XOR reg64, reg/mem64 | 33h /r | Effectue un «Ou exclusif binaire» du contenu d'un registre de 64 bits avec le contenu d'une opérande mémoire ou 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 | 16+EA | 7 | 6 | 3 | 2 à 4 |
reg,mem | 9+EA | 7 | 6 | 2 | 2 à 4 |
mem,immed | 17+EA | 7 | 7 | 3 | 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 | 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
Cet exemple permet de mettre la valeur 0 dans le registre EAX (EAX = 0). Cette technique utilise moins d'octets que l'instruction «MOV EAX,0», cependant il modifie l'état du registre des drapeaux, il faut donc l'utiliser avec astuce lors d'optimisation de code :
- XOR EAX,EAX
L'exemple suivant permet d'appliquer un ou exclusif de 1 au registre AL :
- XOR AL,1
L'exemple suivant permet d'appliquer un ou exclusif de 1 au registre AX :
- XOR AX,1
L'exemple suivant permet d'effectuer une opération «DI = DI xor 3333h» :
- XOR DI,3333h
L'exemple suivant permet d'appliquer un ou exclusif de 1 au registre EAX :
- XOR EAX,1
L'exemple suivant permet d'appliquer un ou exclusif de 1 au registre RAX :
- XOR RAX,1
L'exemple suivant permet d'effectuer une opération «AX = AX xor BX» :
- XOR AX,BX
Le contenu des mots de l'emplacement mémoire spécifié par DI est un «Ou exclusif binaire» avec le registre AX :
- XOR AX,[DI]
L'exemple suivant permet d'appliquer un ou exclusif du registre EBX à l'emplacement mémoire EAX :
- XOR [EAX],EBX
L'exemple effectuer un ou exclusif binaire du registre CL avec le contenu en octets de l'emplacement de mémoire spécifié par le registre EAX :
- XOR [EAX],CL
L'exemple suivant permet d'appliquer un ou exclusif du registre RBX à l'emplacement mémoire RAX :
- XOR [RAX],RBX
L'exemple suivant permet d'appliquer un ou exclusif du registre EAX à l'emplacement mémoire absolue :
- XOR [01234ABC],EAX
L'exemple suivant permet d'appliquer un ou exclusif du registre RAX à l'emplacement mémoire spécifié par le symbole :
- XOR [UnSymbole],RAX
Le contenu en octets de l'emplacement de mémoire spécifié par TABLEAU plus SI est «Ou exclusif binaire» avec le registre AL :
- XOR TABLEAU[SI],AL
Voici un exemple permettant d'échanger les valeurs des registres AX et BX à l'aide de l'opérateur XOR :
- .MODEL small
- .STACK 100h
- .DATA
- Message1 DB 'Valeur de AX = ','$'
- Message2 DB ', Valeur de BX = ','$'
- CRLF DB 13,10,'$'
- .CODE
- PrintDigit PROC NEAR
- OR AX,AX
- JNS Positif
- PUSH AX
- MOV AH,02h
- MOV DL,'-'
- INT 21h
- POP AX
- NEG AX
- Positif:
- MOV BX,10
- XOR CX,CX
- NextDigit:
- XOR DX,DX
- DIV BX
- PUSH DX
- INC CX
- OR AX,AX
- JNZ NextDigit
- PrintOneDigit:
- POP AX
- ADD AL,48
- MOV DL,AL
- MOV AH,02h
- INT 21h
- LOOP PrintOneDigit
- RET
- ENDP
-
- Exchange PROC NEAR
- XOR AX,BX
- XOR BX,AX
- XOR AX,BX
- RET
- ENDP
-
- .startup
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message1
- INT 21h
- MOV AX,-1234
- MOV BX,76
- CALL Exchange
- PUSH BX
- CALL PrintDigit
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message2
- INT 21h
- POP AX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
- MOV AX,4C00h
- INT 21h
- END
on obtiendra le résultat suivant :
Valeur de AX = 76, Valeur de BX = -1234Voir également
Instruction assembleur 80x86 - Instruction OR
Instruction assembleur 80x86 - Instruction AND
Instruction assembleur 80x86 - Instruction NOT
Instruction assembleur 80x86 - Instruction NEG
Langage de programmation - Turbo Pascal - Référence de procédures et fonctions - XOR
Mathématique - Algèbre de Boole - Table de vérité
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 419
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 248.
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 547 à 549.