Verständnis cmp-Anweisung
Ich bin sehr neu auf Montage und jetzt versuche ich, zu verstehen, wie cmp
funktioniert. Hier ist, was geschrieben steht
cmp arg2, arg1
Führt eine Vergleichs-operation von arg1 und arg2. Der Vergleich
erfolgt durch eine (signierte) Subtraktion von arg2 arg1, die Ergebnisse
davon können aufgerufen werden, Temp. Temp wird dann verworfen.
Was bedeutet es "Temp wird dann verworfen"? Wo ist es gespeichert? Wie kann ich das Ergebnis des Vergleichs? Kann sich das jemand erklären?
- Cos AFAIK es wird oft mit
je
. Aber je kennen muss, wenn die Bedingung wahr ist oder falsch. - Beachten Sie, dass Sie ' re unter Bezugnahme auf wikibooks, die ist eine Besondere Sammlung von wikis. Ein wiki ist nur eine Art von website, die Benutzer Bearbeiten können. Und als solche, wikibooks ist definitiv nicht die prime Quelle für x86 assembly Definitionen (dieses ist ein gutes Beispiel, warum es manchmal besser, sich auf Experten-Dokumentation als user-generated-Dokumentation). Verwenden Sie google, um zu finden eine andere Quelle, und interpretieren!
je
braucht nicht zu wissen, wenn Bedingung wahr ist oder falsch,je
ist aliasjz
, undjz
ist der "Sprung, wenn zero-flag gesetzt ist". Also, was auch immer Letzte Anweisung, die hat ändern die ZF, dass man vorhersagt, ob die nächsteje
nehmen einen Sprung (ZF=1) oder nicht (ZF=0). Eine der witzigen Folgen der neuen asm-Programmierer nicht verstanden haben, ist, code zu schreiben, wiesub ax,1
cmp ax,0
jne myLoop
... dasscmp
ist nicht erforderlich, da, wie früheresub
wird bereits festgelegt, die ZF in ausreichender Weise für dasjne
Arbeit (aber logischer wäre, die Nutzungjnz myLoop
alias, d.h. liest sich wie "jump not zero-loop" - fast Englisch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
cmp arg2, arg1
führt die gleiche operation wiesub arg2, arg1
außer, dass keiner der Operanden geändert werden. Der Unterschied ist nicht gespeichert überall.Jedoch, das register flags ist aktualisiert und kann verwendet werden, in der ein bedingter Sprung, wie jump-if-equal (
JE
), am häufigsten als die nächste Anweisung nach dercmp
.Den Vorteil gegenüber anderen Anweisungen ist, dass können Sie zwei Werte vergleichen, ohne Sie zu zerstören jeden von Ihnen. Wenn du das getan hast
sub arg2, arg1
und Sie passieren gleich zu sein, einer von Ihnen wäre null danach. Mitcmp
Sie sind beide noch da.Verwenden wir
cmp arg2, arg1
wenn wir uns sorgen, ob arg1 und arg 2 gleich sind. Der Prozessor bestimmt, das durch Subtraktion von arg2 arg1, dann Blick auf das Ergebnis. Wenn das Ergebnis null ist (das heißt, arg1 = arg2), dann der Prozessor setzt das zero-flag (durch die "sets the flag", meinen wir, es setzt ihn auf 1). Umgekehrt, wenn das Ergebnis nicht null ist (das heißt, arg1 != arg2), dann der Prozessor löscht das zero-flag (ich.e, setzt es auf 0). Das Ergebnis selbst ist verworfen, denn wir kümmern uns nicht, was es ist, nur ob es null ist oder nicht, das wissen wir jetzt, basierend auf, ob das zero-flag gesetzt ist. Wir können dann Anweisungen wieJE
,JNE
,JZ
undJNZ
Untersuchung das null-flag und springen (oder nicht), basierend auf den Wert. Im Fall vonJE
(jump if equal), der Sprung geschehen wird, wenn das zero-flag gesetzt ist, die (wie wir oben erfahren) es sein wird, wenn die Argumente in dercmp
gleich waren.