Zweck der cmove Unterricht in x86 Assembler?
Bei der Demontage einer ausführbaren Datei, die ich gestoßen die cmove
Unterricht. Ich habe schon gesucht im Internet aber ich habe nur gefunden, dass es eine bedingte bewegen, und wenn die Quelle und das Ziel gleich sind, eine mov
Auftritt. Was ich nicht verstehe ist doch, warum brauche ich es, da es nicht ändern Sie den Operanden. Was ist Ihr Zweck?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
CMOVcc
Anweisungen nicht zu vergleichen, die Quelle und das Ziel. Es verwendet die flags aus einem früheren Vergleich (oder eine andere operation setzt die flags), die bestimmt, ob der Umzug durchgeführt werden soll oder nicht.Beispiel; diese Kopien
edx
zuecx
wenneax
undebx
gleich:Dieser macht das gleiche wie:
cmov
mit einer memory-source-operand, wiecmoveq eax, [edx]
ist ein bedingungslose Last-feeds ein ALU select operation. Es wird die Schuld auf eine schlechte Adresse auch wenn die Bedingung false ist. Und der Punkt dercmov
ist, ein data-dependency statt einer Kontroll-Abhängigkeit (branch misprediction möglich ist).Zweck der
cmov
ist es, software (in einigen Fällen) zu verhindern, dass ein Zweig.Wenn du zum Beispiel diesen code:
..dann, wenn eine moderne CPU sieht die
jne
Filiale es dauert eine Vermutung darüber, ob die Verzweigung genommen oder nicht genommen, und starten Sie dann in spekulativer Weise Befehle auszuführen, die auf der Grundlage der Vermutung. Wenn die Vermutung falsch ist, gibt es einen performance-Strafe, weil die CPU zu verwerfen spekulativ ausgeführten arbeiten und starten Sie dann abrufen und ausführen den richtigen Pfad.Bedingte verschieben (z.B.
cmove eax,edx
) die CPU braucht nicht zu raten, welcher code wird ausgeführt und die Kosten für eine mispredicted Zweig wird vermieden. Aber die CPU kann nicht wissen, ob der Wert ineax
ändern wird oder nicht, was bedeutet, dass spätere Anweisungen, die abhängig von den Ergebnissen der bedingten Umzug zu warten, bis der bedingte verschieben abgeschlossen ist (anstatt spekulativ ausgeführt mit einem angenommenen Wert und nicht Abwürgen).Dies bedeutet, dass, wenn der Zweig kann leicht vorhergesagt ein Zweig kann schneller sein; und wenn der Zweig kann nicht einfach vorausgesagt, der Zustand bewegen kann schneller sein.
Beachten Sie, dass eine bedingte Bewegung ist nie zwingend erforderlich (es kann immer durchgeführt werden, mit einer Niederlassung statt) - es ist mehr wie eine optionale Optimierung.