Differenz zwischen "or eax, eax" und "test eax, eax" [duplizieren]
Diese Frage hat hier bereits eine Antwort:
Test ob ein Register Null ist mit CMP reg, 0 vs OR reg, reg? 2 AntwortenWas ist der Unterschied zwischenor eax,eax
undtest eax,eax
? Ich habe verschiedene Compiler gesehen, die beide für den gleichen Vergleich produzieren, und was die Dokumentation betrifft, tun sie genau das Gleiche. Deshalb frage ich mich, warum sie nicht alle @ verwendetest eax,eax
. Darüber nachdenkenand eax,eax
würde die Flags auf die gleiche Weise setzen wie entweder, aber ich habe es weder in Freepascal, Delphi noch in msVC ++ gesehen.
Ich habe einige asm-Blöcke in delphi kompiliert und die Assembler-Quelle ausgecheckt. Alle drei Formulare haben die exakt gleiche Länge in Opcodes. Außerdem habe ich die PDF-Datei mit der Intel-Leistung überprüft und sie haben die gleiche Latenz und den gleichen Durchsatz.
Bearbeiten
Die Frage ist speziell über den Unterschied zwischen den einzelnen Fällentest eax,eax
, or eax,eax
undand eax,eax
. Alle 3 ergeben völlig identische Ergebnisse für Register, Flags, Opcode-Länge, Latenz, Durchsatz. Und dennoch verwenden einige Compiler zum Testen, ob 0, wenn nicht Null oder signiert,test eax,eax
während einige verwendenor eax,eax
, und ich habe mich gefragt, warum sie nicht alle @ verwendtest eax,eax
da es den Code etwas klarer macht.
Edit2:
Zum Nachschlagen, ich bin zu Hause und habe nur und ältere msvc ++ und Delphi hier, aber teste eine Variable, wenn Null, macht msvc ++test eax,eax
, während Delphi @ tor eax,eax
.