Quel est le but de XORing un registre avec lui-même?

xor eax, eax mettra toujours eax à zéro, non? Alors, pourquoi MSVC ++ le met-il parfois dans le code de mon exécutable? Est-ce plus efficace que mov eax, 0 ?

 012B1002 in al,dx 012B1003 push ecx int i = 5; 012B1004 mov dword ptr [i],5 return 0; 012B100B xor eax,eax 

En outre, que signifie faire in al, dx ?

Oui, c’est plus efficace.

Le code opération est plus court que mov eax, 0 , seulement 2 octets, et le processeur reconnaît le cas particulier et le traite comme un mov eax, 0 sans dépendance de lecture fausse sur eax , donc le temps d’exécution est le même.

Aussi pour éviter les 0 lorsqu’il est compilé comme utilisé sur les codes shell pour l’exploitation des dépassements de mémoire tampon, etc. Pourquoi éviter le 0? Eh bien, 0 représente la fin de chaîne dans c / c ++ et le code shell serait tronqué si le moyen d’exploitation est une fonction de traitement de chaîne ou similaire.

Btw im se référant à la question initiale: “Une raison de faire un” xor eax, eax “?” pas ce que fait le compilateur MSVC ++.

Comme il y a un débat dans les commentaires sur la façon dont cela est pertinent dans le monde réel, voir cet article et cette section sur Wikipedia.

xor eax, eax est un moyen plus rapide de mettre eax à zéro. Cela se produit parce que vous retournez zéro.

L’instruction in cours fait des choses avec les ports d’E / S. En gros, lire un mot de données du port spécifié dans dx et le stocker dans al . On ne sait pas pourquoi cela se passe ici. Voici une référence qui semble l’expliquer en détail.

L’opération XOR est en effet très rapide. Si le résultat est de définir un registre à zéro, le compilateur le fera souvent le plus rapidement possible. Une opération bit comme XOR peut ne prendre qu’un seul cycle CPU, alors qu’une copie (d’un registre à un autre) peut prendre une petite poignée.

Les auteurs de compilateurs ont souvent des comportements différents selon les architectures de processeurs cibles.

Une autre raison d’utiliser le XOR reg, reg ou le XORPS reg, reg est de casser les chaînes de dépendance, ce qui permet au CPU d’optimiser l’exécution parallèle des commandes d’assemblage plus efficacement (même s’il ajoute un peu plus de débit d’instruction).

de l’OP> toute raison de faire “xor eax, eax” retourne 0; 012B100B xor eax, eax ret <- OP ne le montre pas

Le XOR EAX, EAX ne contient que le registre EAX, il s’exécute plus vite qu’un MOV EAX, 0 $ et n’a pas besoin de récupérer les données immédiates de 0 pour les charger dans eax

Il est très évident que le “retour 0” que MSVC optimise EAX est le registre utilisé pour renvoyer une valeur d’une fonction dans MSVC

xor est souvent utilisé pour chiffrer un code par exemple

  mov eax,[ecx+ValueHere] xor eax,[ecx+ValueHere] mov [ebx+ValueHere],esi xor esi,[esp+ValueHere] pop edi mov [ebx+ValueHere],esi 

L’instruction XOR connecte deux valeurs à l’aide de OU exclusif logique rappelle OU utilise inclusif OU Pour mieux comprendre XOR, considérons ces deux valeurs binarys:

  1001010110 0101001101 

Si vous les OR, le résultat est 1100011011 Lorsque deux bits au-dessus l’un de l’autre sont égaux, le bit résultant est 0. Sinon, le bit résultant est 1. Vous pouvez utiliser calc.exe pour calculer XOR.