web-dev-qa-db-fra.com

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 place-t-il parfois dans le code de mon exécutable? Est-il 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 

De plus, que signifie faire in al, dx?

106
devoured elysium

Oui, c'est plus efficace.

L'opcode est plus court que mov eax, 0, seulement 2 octets, et le processeur reconnaît le cas spécial et le traite comme mov eax, 0 sans une fausse dépendance de lecture sur eax, donc le temps d'exécution est le même.

135
Gunther Piez

Également pour éviter les 0 lorsqu'ils sont compilés tels qu'utilisés sur les codes Shell pour l'exploitation des débordements de tampon, etc. Pourquoi éviter le 0? Eh bien, 0 représente la fin de la chaîne en 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 d'origine: "Une raison de faire un" xor eax, eax "?" pas ce que fait le compilateur MSVC++.

Puisqu'il y a un débat dans les commentaires sur la pertinence de cela dans le monde réel, voir cet article et cette section sur Wikipedia.

25
kripto_ash

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 fait des choses avec les ports d'E/S. Fondamentalement, lire un mot de données à partir du port spécifié dx dans et le stocker dans al. On ne sait pas pourquoi cela se produit ici. Voici un référence qui semble l'expliquer en détail.

14
i_am_jorf

L'opération XOR est en effet très rapide. Si le résultat est de mettre un registre à zéro, le compilateur le fera souvent de la manière la plus rapide qu'il connaisse. Une opération bit comme XOR peut ne prendre qu'un seul cycle CPU, tandis qu'une copie (d'un registre à un autre) peut prendre une petite poignée.

Souvent, les rédacteurs de compilateurs auront même des comportements différents compte tenu des architectures CPU cibles différentes.

0
weiji

Une autre raison d'utiliser XOR reg, reg ou XORPS reg, reg est de briser les chaînes de dépendances, ce qui permet au CPU d'optimiser l'exécution parallèle des commandes Assembly plus efficacement (même si cela ajoute un peu plus de débit d'instructions).

0
Quonux