test eax, eax
-
Hi,
folgenden Code sehe ich des öfteren:test eax, eax
Wo ist der Sinn? Ich verstehe das nicht. Nach meinem Verständnis ist es das gleiche wie
if (a == a) // bzw. if (1 == 1)
Das ergibt IMMER
true
oder nicht?
-
TEST führt eine UND-Verknüpfung durch - im Gegensatz zu AND wird das Ergebnis aber verworfen. Es werden nur die Flags entsprechend dem Resultat gesetzt. Typische Anwendung ist hier das Prüfen auf gesetzte Bits oder, wie in deinem Beispiel, ob das Register auf null gesetzt ist. (außerdem möglich: Parität, signe)
if(a) {...}
-
Ah, danke
-
Internetseiten dazu z.B.
http://net.pku.edu.cn/~course/cs201/2004/Assembly/asmutils-0.17/doc/s-optimize.html
oder
http://www.agner.org/optimize/optimizing_assembly.pdf
-
was ist der genaue Unterschied zwischen dem Einsatz von
test eax, eax
und
or eax, eax
-
bei OR wird das Ergebnis in eax geschrieben -> erzeugt mehr µops und unnötige Abhänigkeit.
-
Erhard Henkes schrieb:
was ist der genaue Unterschied zwischen dem Einsatz von
test eax, eax
und
or eax, eax
Anstelle von test eax, eax kann man auch or eax, eax verwenden.
Es werden die gleichen Flags gesetzt oder geloescht, wie nach test eax, eax
Beide Befehle sollen gleich schnell sein.
Ich nehme zum Testen eines Registers immer den or -Befehl.
Statt test eax, eax kann man auch and eax, eax schreiben.
test nehme ich nur, wenn das Ergebnis verworfen werden muss.mfg
-
-
masm schrieb:
TEST führt eine UND-Verknüpfung durch - im Gegensatz zu AND wird das Ergebnis aber verworfen.
{...}[/cpp]UND = AND
AND = UND
-
-.-.-.- schrieb:
masm schrieb:
TEST führt eine UND-Verknüpfung durch - im Gegensatz zu AND wird das Ergebnis aber verworfen.
{...}[/cpp]UND = AND
AND = UNDwie soll man das den jetzt verstehen? - bitte klär uns auf!
-
masm schrieb:
wie soll man das den jetzt verstehen? - bitte klär uns auf!
Das klingt doch sehr logisch, findest du nicht?