J'entre dans Assembly et je continue à courir dans xor, par exemple:
xor ax, ax
Efface-t-il simplement la valeur du registre?
A XOR B
en anglais serait traduit par "sont A et B différents". Alors xor ax, ax
mettra ax
à zéro puisque ax est toujours égal à lui-même.
A B | A XOR B
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
xor reg, reg
est souvent utilisé pour effacer le registre. Cela peut être une alternative à mov reg, 0
AFAIR, c'était plus rapide (ou plus court) dans certains cas.
Et bien sûr, XOR lui-même est eXclusive OR (alias: disjonction exclusive)) (mais il est dommage de décrire ici de telles bases - utilisez Wikipedia)
xor ax, ax
est le moyen le plus rapide de définir le registre de hache sur 0
. Plus rapide en termes de taille et de nombre d'instructions. Pour plus de détails sur la façon dont cela fonctionne, vous avez besoin d'une petite connaissance de l'arithmétique des bits.
L'opération XOR entre deux bits renvoie 1 si n et un seul des deux bits est 1; 0 sinon. Une autre façon d'expliquer est qu'il renvoie 1 si les deux bits sont différents; 0 sinon.
Le fonctionnement XOR entre deux nombres binaires de même longueur fonctionne de la même façon bit par bit. XOR deux nombres vous obtenez un nombre avec des bits mis à 1 où les bits correspondants des deux opérandes diffèrent, 0 lorsque les bits correspondants sont identiques.
D'après cette connaissance, il est assez facile de voir que si les deux opérandes sont identiques (ax et ax par exemple), le résultat sera 0.
xor register, register
est couramment utilisé pour mettre à zéro un registre, car tous les bits sont comparés les uns aux autres:
Les bits 0 restent nuls. 1 bits devient nul, car 1 XOR 1 vaut également 0.
xor = exclusif ou. Voir la définition de wikipedia pour Exclusif o .
Si vous xor un registre avec lui-même, il mettra à zéro ce registre.
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Prenons la valeur 41 comme exemple (en binaire):
101001
xor 101001
= 000000
A B | XOR
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
L'instruction XOR effectue l'opération ci-dessus sur chaque paire de bits des deux opérandes. Donc 0xFF xor 0xFF
serait 0x00
et 0x55 xor 0xAA
serait 0xFF
. Et oui, xor ax ax
efface ax
.
Dans ce cas, il effacera le registre ... XOR est un "exclusif ou" ... donc si ax contient 1010 et vous exclusif ou qu'avec 1010 vous obtiendrez 0000 (effacé)
Quand j'ai commencé à programmer il y a longtemps, il n'y avait pas d'exclusivité ni sur le processeur ni dans le compilateur. Quand j'y suis arrivé, je suis resté sur les descriptions:
alors:
0 or 0 = 0
0 or 1 = 1
1 or 0 = 1
1 or 1 = 1
et
0 xor 0 = 0
0 xor 1 = 1
1 xor 0 = 1
1 xor 1 = 0
Il détermine la logique eXclusive OU
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Donc, VRAI seulement si l'une des expressions est vraie, pas les deux.
Si je me souviens bien xor ax, ax est une instruction d'assemblage à un octet, tandis que mov ax, serait au moins 3 et prendrait probablement un peu plus de temps à exécuter. Le décodage prendra certainement plus de temps que l'instruction xor.
xor ax, ax est utilisé pour mettre ax à 0.
Raison: généralement, l'instruction xor sur n'importe quel processeur prend moins d'octets lors de l'assemblage que l'utilisation de movl 0,%ax