2011-11-20 9 views
6

De temps en temps, nous devons analyser des morceaux de code assembleur (IA32), et plus que je viens souvent à travers une instruction qui ressemble à ceci:registre XOR, registre (assembleur)

xor ax, ax 

ou autres registres également: xor dx, dx, xor al, al, ...

Qu'est-ce que cela fait exactement? (Hache hache XOR donne toujours 0?)

+0

en double de http://stackoverflow.com/questions/1396527/toute-raison-de-faire-un-xor-eax-eax – mark4o

+0

http://stackoverflow.com/questions/33666617/quelle-que-est-cette-voie-de-regarder-a-zero-in -x86-assembly-xor-mov-ou-et (xor est le meilleur moyen) –

Répondre

13

C'est un langage assembleur commun pour définir un registre à 0.

xor ax, ax correspond à ax = ax^ax qui, comme vous avez déjà des avis, est effectivement ax = 0.

Si je me souviens bien le principal avantage est que son code de taille est plus petite que mov ax, 0

+0

Merci, je suis aginé il devait être quelque chose de différent que de le mettre à 0 puisque j'utiliserais 'mov ax, 0 'pour cela, mais si cela produit une taille de code plus courte cela a plus de sens en effet. – Aerus

2

C'est exactement ce qu'il fait - zéro le contenu d'un registre

1

hache XOR%,% hache, comme indiqué dans les commentaires précédents correspond à ax = ax xor ax. Cela définit essentiellement ax = 0. En outre, il affecte/modifie certains des EFLAGS tels que OF, CF, SF, PF ou ZF. Dans ce cas, les indicateurs PF et ZF seront définis.

SF - Indique si le résultat de la dernière opération a conduit à une valeur dont le bit le plus significatif est mis à 1.

PF - Indique si le nombre de bits de consigne est impair ou pair dans la représentation binaire de la résultat de la dernière opération.

ZF - Elle est définie si le résultat de l'opération mathématique/logique est zéro ou réinitialisé dans le cas contraire.

Exemple illustré ci-dessous avec des extraits GDB.

Instruction: hache XOR%,% hache

Avant "XOR"

(gdb) info registers 
eax   0xaa55 43605 
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c02 0x7c02 
eflags   0x2 [ ] 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 

Après "XOR"

(gdb) info registers 
eax   0x0 0   --------------------> AX = 0   
ecx   0x0 0 
edx   0x80 128 
ebx   0x0 0 
esp   0x6f20 0x6f20 
ebp   0x0 0x0 
esi   0x0 0 
edi   0x0 0 
eip   0x7c04 0x7c04 
eflags   0x46 [ PF ZF ] --------------------> Flags Set 
cs    0x0 0 
ss    0x0 0 
ds    0x0 0 
es    0x0 0 
fs    0x0 0 
gs    0x0 0 
+0

Bienvenue sur SO. Cette réponse est plus détaillée que ce qui est utile, IMO. Vous n'avez pas besoin d'expliquer comment fonctionnent tous les indicateurs en réponse à une question sur un idiome de réduction à zéro. Il suffirait de laisser un commentaire indiquant que contrairement à 'mov reg, 0', xor affecte les drapeaux. Puisque votre réponse a sauté cette question sur la page d'accueil de l'activité récente, j'ai fini par laisser un commentaire à une question avec un lien vers une réponse beaucoup plus détaillée sur la raison pour laquelle xor est la meilleure façon de zéro regs. (Où j'ai mentionné que dans la plupart des cas, faites la mise à zéro avant l'instruction dont vous voulez les résultats de drapeau.) –

+0

Merci .. Je suis d'accord qu'il a plus de détails que nécessaire. Je le remarque maintenant. – scanjee