2013-02-12 23 views
15

Korrigieren Sie mich, wenn ich falsch liege.JNZ & CMP Montageanleitung

Dies ist mein Verständnis von JNZ und CMP.

JNZ - Der Sprung stattfinden, wenn die Z Flag nicht gleich Null ist (1)

CMP - Wenn die beiden Werte gleich sind, die Z Flag gesetzt (1), sonst wird es nicht gesetzt (0)

Olly DBG

Dies ist eine Flash-Tutorial ich gerade bin. Es lehrt die Lösung eines einfachen CrackMe. Wie Sie sehen können, hat die vorherige Anweisung AL mit 47h verglichen. Sie waren gleich, was die Z Flagge setzte. (Sie können es in den Registern auf der rechten Seite sehen)

Die nächste Anweisung ist ein JNZ. Mein Verständnis war, dass der Sprung stattfindet, wenn das Z Flag gesetzt ist. Das Flag Z ist gesetzt, aber der Sprung findet nicht statt!

Warum?

+1

@nrz Ihr Kommentar ist nicht sehr klar - ist das OP erwartet, um den Fehler zu erkennen, indem Sie auf die Aussage wirklich, wirklich hart? –

+0

@nrz Jeez Mann willst du mich noch mehr verwirren?!?! Von den anderen Antworten weiß ich jetzt, dass mit JNZ der Sprung nur stattfindet, wenn das Null-Flag NICHT gesetzt ist (0) –

+1

@ 43.52.4D. Entschuldigung, ich habe den Satz "JNZ - Der Sprung findet statt, wenn die Z-Flagge NICHT NULL (1) ist" in Ihrer Frage falsch gelesen, und als Ergebnis war mein Kommentar möglicherweise verwirrend, also habe ich ihn jetzt gelöscht. [Intel x86 JUMP-Kurzreferenz] (http://www.unixwiz.net/techtips/x86-jumps.html) hat eine nützliche Tabelle, um die Verzweigungsbedingungen verschiedener x86 bedingter Sprünge zu überprüfen. – nrz

Antwort

24

JNZ ist die Abkürzung für "Sprung wenn nicht Null (ZF = 0)" und NICHT "Springe, wenn ZF gesetzt ist".

Wenn es leichter ist, sich daran zu erinnern, beachten Sie, dass JNZ und JNE (springe, wenn nicht gleich) äquivalent sind. Deshalb, wenn Sie cmp al, 47 tun und der Inhalt von AL gleich 47 ist, wird der ZF gesetzt, ergo der Sprung (wenn nicht gleich - JNE) sollte nicht genommen werden.

11

Ich werde hier eine etwas breitere Antwort geben.

Es ist in der Regel spricht zwei Arten von bedingten Sprüngen in x86:

  1. Arithmetik springt - wie JZ (Sprung, wenn Null), JC (Sprung, wenn carry), JNC (Sprung, wenn nicht tragen), usw. .

  2. Vergleich springt - JE (Sprung, wenn gleich), JB (Sprung, wenn unten), JAE (Sprung, wenn über oder gleich) usw.

So verwenden Sie den ersten Typ erst nach Arithmetik oder logischer Befehl gen:

sub eax, ebx 
jnz .result_is_not_zero 

and ecx, edx 
jz .the_bit_is_not_set 

erst nach CMP Anweisungen, um die zweite Gruppe Verwendung:

cmp eax, ebx 
jne .eax_is_not_equal_to_ebx 

cmp ecx, edx 
ja .ecx_is_above_than_edx 

Auf diese Weise wird das Programm besser lesbar und Sie werden nie verwechselt werden.

Beachten Sie, dass diese Anweisungen manchmal tatsächlich Synonyme sind. JZ == JE; JC == JB; JNC == JAE und so weiter. Die vollständige Tabelle folgt.Wie Sie sehen können, gibt es nur 16 bedingte Sprunganweisungen, aber 30 Mnemotechnik - sie Schaffung von mehr lesbaren Quellcode zu ermöglichen, wird zur Verfügung gestellt:

Mnemonic  Condition tested Description 

jo    OF = 1   overflow 
jno    OF = 0   not overflow 
jc, jb, jnae CF = 1   carry/below/not above nor equal 
jnc, jae, jnb CF = 0   not carry/above or equal/not below 
je, jz   ZF = 1   equal/zero 
jne, jnz  ZF = 0   not equal/not zero 
jbe, jna  CF or ZF = 1  below or equal/not above 
ja, jnbe  CF or ZF = 0  above/not below or equal 
js    SF = 1   sign 
jns    SF = 0   not sign 
jp, jpe   PF = 1   parity/parity even 
jnp, jpo  PF = 0   not parity/parity odd 
jl, jnge  SF xor OF = 1  less/not greater nor equal 
jge, jnl  SF xor OF = 0  greater or equal/not less 
jle, jng (SF xor OF) or ZF = 1 less or equal/not greater 
jg, jnle (SF xor OF) or ZF = 0 greater/not less nor equal 
2

Zunächst scheint es, als ob JNZ Sprung bedeutet, wenn nicht Null (0), wie im Sprung, wenn das Null-Flag 1/gesetzt ist.

Aber in Wirklichkeit bedeutet es Sprung (wenn) nicht Null (ist gesetzt).

Wenn 0 = nicht gesetzt und 1 = setzt dann nur nicht vergessen:
JNZ Sprünge, wenn der Null-Flag nicht gesetzt ist (0)

0
JNZ  Jump if Not Zero ZF=0 

Tatsächlich wird dieses Recht verwirrend.

Um es einfacher zu verstehen, ersetzen nicht Null mit Nicht Set. (Bitte beachten Sie dies für Ihr eigenes Verständnis ist)

Daher

JNZ  Jump if Not Set  ZF=0 

Nicht gesetzt bedeutet Flag Z = 0. Also Jump (Sprung, wenn nicht gesetzt) ​​

Set bedeutet Flag Z = 1 Also, nicht springen