In der x86 was ist der Unterschied zwischen "test eax,eax" und "cmp eax,0"
Ist test eax, eax
effizienter als cmp eax, 0
? Ist es jedem Fall, dass der test eax, eax
ist dort notwendig, wo cmp eax, 0
nicht erfüllen Anforderung?
test
ist kürzer alscmp
, als es sich nicht enthalten, eine sofortige.- In dem Beispiel, haben Sie zur Verfügung gestellt, es gibt keinen Unterschied von einem OpCode zählen Standpunkt. Sie sind nur zu Fragen, "ist" EAX " zero?", so kann es nur eine Frage der Konsistenz im gesamten code. Verweis auf Intel-Architekturen und Anleitung intel.com/content/www/us/en/processors/...
- Peter Cordes hat eine gute Antwort hier: stackoverflow.com/a/33724806/3857942 berührt, die auf die Unterschiede zwischen
cmp
undtest
. Die Frage selbst ist nicht eine doppelte, weil die gestellte Frage über die Verwendungor
zum testen, aber die Antwort ist durchaus relevant für diese Frage. - Die beste Wahl für den Vergleich eines Registers mit null auf modernen x86 ist
test reg, reg
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Zang MingJie schon gesagt hat, in einem Kommentar,
test eax,eax
ist fast identisch mitcmp eax,0
, außer, dass es kürzer alscmp
, weil mitcmp
Sie zu liefern haben0
als argument. Beachten Sie, dass die Einsparungen nicht sehr groß, weil der 2. operand wird Vorzeichen erweitert, um die Größe des 1. operand ist, so dass es nicht unbedingt einen ganzen 4 Byte darstellen, die null.Nun, was Sie Fragen, ist, ob es irgendeinen anderen Unterschied. Dies ist eine vernünftige Frage zu Fragen, weil
cmp
ist eine arithmetische operation, (es führt eine Subtraktion und verwirft das Ergebnis), währendtest
ist ein logischer Vorgang, (es führt eine bitweise UND-Verknüpfung und legt das Ergebnis), so könnte man vernünftigerweise vermuten, dass Sie möglicherweise ändern Sie dieFlags
registrieren anders.Als es stellt sich heraus, dass beide Anweisungen ändern Sie die
Flags
register in einem fast identische Weise. Beide Anweisungen ändern Sie die VON SF ZF AF PF CF und bits des flags-Registers. Dietest
Unterricht immer löscht und CF, aber das ist auch das, wascmp
gegen null wird. Der einzige andere Unterschied ist, dass diecmp
Anleitung richtig eingestellt der undurchsichtigeAF
- flag, während dietest
Anweisung verlässt der Inhalt des flag undefiniert. Aber im Fall voncmp eax,0
die AF wird immer gelöscht, unabhängig vom Wert dereax
, so gibt es nichts, was man lernen kann, eincmp eax,0
dass Sie würde nicht lernen, aus einemtest eax,eax
.Daher würde ich schlussfolgern, dass es keine situation gibt, wo
test eax,eax
dir etwas geben, dasscmp eax,0
nicht, noch Umgekehrt. Die beiden Anweisungen, die angezeigt werden vollkommen austauschbar für jede praktische oder auch nicht-so-praktischen Zweck, außer für das speichern von einem byte oder zwei instruction code.Mit
test eax,eax
stattcmp eax,0
zeigt, dass Sie wissen, dass Ihre Montage. Es zeigt auch, dass Sie lieber ein etwas kryptisch, und geringfügig bessere Leistungen der Belehrung über eine einfache, verständliche Anleitung. Dies ist die Art von Sache, die dazu neigt, zu sammeln Sie bonus-Punkte von anderen geeks, aber es hat keine praktische Nützlichkeit in der realen Welt in den letzten paar Jahrzehnten oder so.test eax,eax / js
, aber nichtcmp eax,0 / js
. Nehalem kann makro-Sicherungcmp eax,0 / jl
, obwohl. (Core2 kann es nicht, aber Core2 können nur makro-Sicherung auf allen 32-bit-Modus). Siehe Agner Fog ist microarch pdf