web-dev-qa-db-de.com

Was ist der Zweck, ein Register mit sich selbst zu XOREN?

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?

106

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.

135
Gunther Piez

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.

25
kripto_ash

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.

14
i_am_jorf

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.

0
weiji

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

0
Quonux