xor eax, eax
setzt eax
immer auf null, oder? Warum schreibt MSVC++ es manchmal in den Code meiner ausführbaren Datei? Ist es effizienter, dass 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
Was bedeutet es auch, in al, dx
?
Ja, es ist effizienter.
Der Opcode ist kürzer als mov eax, 0
, nur 2 Bytes, und der Prozessor erkennt den Sonderfall und behandelt ihn als mov eax, 0
ohne eine falsche Leseabhängigkeit von eax
, daher ist die Ausführungszeit dieselbe.
Auch um Nullen bei der Kompilierung zu vermeiden, wie sie in Shell-Codes zur Ausnutzung von Pufferüberläufen usw. verwendet werden. Warum die Null vermeiden? Nun, 0 stellt das Ende der Zeichenkette in c/c ++ dar und der Shell-Code würde abgeschnitten, wenn der Mittelwert der Ausnutzung eine Zeichenkettenverarbeitungsfunktion oder dergleichen ist.
Übrigens beziehe ich mich auf die ursprüngliche Frage: "Gibt es einen Grund, ein" xor eax, eax "zu machen?" nicht das, was der MSVC++ - Compiler tut.
Da es in den Kommentaren einige Debatten darüber gibt, wie dies in der realen Welt relevant ist, lesen Sie diesen Artikel und diesen Abschnitt auf Wikipedia.
xor eax, eax
ist eine schnellere Möglichkeit, eax
auf Null zu setzen. Dies geschieht, weil Sie null zurückgeben.
Die Anweisung in
bearbeitet E/A-Ports. Grundsätzlich wird ein Datenwort von dem angegebenen Port dx
eingelesen und in al
gespeichert. Es ist nicht klar, warum es hier passiert. Hier ist eine Referenz , die es im Detail zu erklären scheint.
Die XOR - Operation ist in der Tat sehr schnell. Wenn das Ergebnis darin besteht, ein Register auf Null zu setzen, führt der Compiler dies häufig auf die schnellste Weise durch, die er kennt. Eine kleine Operation wie XOR benötigt möglicherweise nur einen CPU-Zyklus, während eine Kopie (von einem Register zum anderen) eine kleine Handvoll dauern kann.
Oft haben Compiler-Schreiber bei unterschiedlichen Ziel-CPU-Architekturen sogar ein unterschiedliches Verhalten.
Ein weiterer Grund für die Verwendung von XOR reg, reg
oder XORPS reg, reg
soll die Abhängigkeitsketten unterbrechen, dies ermöglicht der CPU, die parallele Ausführung der Assembly-Befehle effizienter zu optimieren (selbst wenn es etwas mehr Befehlsdurchsatzdruck hinzufügt).