web-dev-qa-db-fra.com

Quelle est la signification de XOR dans un assemblage x86?

J'entre dans Assembly et je continue à courir dans xor, par exemple:

xor     ax, ax

Efface-t-il simplement la valeur du registre?

37
Chiggins

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
48
orlp

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)

18
Lukasz

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.

12
Salman A

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.

6
Daniel Stelter

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
4
jweyrich
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.

3
nmichaels

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é)

2
John K.

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:

  • ou: vrai si a = 1 ou b = 1 ou les deux = 1
  • xor: vrai si a = 1 ou b = 1 mais pas les deux = 1

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
2
Olof Forshell

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.

1
Dirk

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.

1
Sean

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

1
Vedhas Deshpande