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
?
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.
É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.
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.
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.
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).