JNZ & amp; Instructions d'assemblage du CMP
Corrigez-moi si je me trompe.
C'est ma compréhension de JNZ
et CMP
.
JNZ
- Le saut AURA lieu si le Z
Drapeau n'est PAS nulle (1)
CMP
- Si les deux valeurs sont égales, la Z
Indicateur est défini (1), sinon elle n'est pas définie (0)
Ceci est un tutoriel flash je suis de regarder. C'est l'enseignement de la solution à un simple CrackMe.
Comme vous pouvez le voir, l'instruction précédente par rapport AL
avec 47h
. Ils sont égaux qui la Z
drapeau. (Vous pouvez le voir dans les Registres de windows sur le côté droit)
La prochaine instruction est un JNZ
. Ma compréhension était que le saut aura lieu si le Z
drapeau est réglé. Le Z
drapeau EST réglé, mais le saut n'a pas lieu!
Pourquoi?
source d'informationauteur 43.52.4D. | 2013-02-12
Vous devez vous connecter pour publier un commentaire.
JNZ est l'abréviation de "Saut si pas de zéro (ZF = 0)", et PAS "Saut si ZF est réglé".
Si c'est plus facile à retenir, considèrent que JNZ et JNE (saut si non égal) sont équivalentes. Par conséquent, lorsque vous êtes en train de faire
cmp al, 47
et le contenu deAL
est égal à 47, la ZF est définie, ergo le saut (si Pas Égal à - JNE) ne doit pas être pris.Je vais faire un peu plus grande la réponse ici.
Il y a généralement deux types de sauts conditionnels en x86:
Arithmétique des sauts comme JZ (saut si zéro), JC (saut si carry), CNP (saut si pas de portage), etc.
Comparaison saute - JE (sauter en cas d'égalité), JB (saut si ci-dessous), JAE (saut si supérieur ou égal), etc.
Utiliser le premier type qu'après arithmétiques ou logiques instructions:
Utiliser le deuxième groupe qu'après CMP instructions:
De cette façon, le programme devient plus lisible et vous ne serez jamais confus.
Remarque, que, parfois, ces instructions sont en fait synonymes. JZ == JE; JC == JB; CNP == JAE et ainsi de suite. L'intégralité de la table est la suivante. Comme vous pouvez le voir, il y a seulement 16 des instructions de saut conditionnel, mais 30 mnémoniques - ils sont fournis pour permettre la création de plus lisible le code source:
Au premier abord il semble comme si JNZ moyens de saut si pas de Zéro (0), comme en saut si drapeau de zéro est de 1/set.
Mais en réalité, cela signifie Sauter (si) pas de Zéro (est).
Si 0 = pas de jeu et 1 = alors n'oubliez pas:
JNZ Sauts si l'indicateur de zéro n'est pas définie (0)
En effet, ceci est source de confusion droit.
Pour le rendre plus facile à comprendre, remplacer Pas Zéro avec Pas Mis. (Veuillez prendre note que ceci est pour votre propre compréhension)
Donc,
Pas Mis les moyens drapeau Z = 0. Afin de saut (Saut si Non Définie)
Ensemble des moyens drapeau Z = 1. Donc, ne PAS Sauter