Este post ha sido probado por nuestros expertos para garantizar la veracidad de este post.
Solución:
JNZ es la abreviatura de “Jump if not zero (ZF = 0)”, y NO “Saltar si el ZF está configurado”.
Si es más fácil de recordar, considere que JNZ y JNE (salto si no es igual) son equivalentes. Por lo tanto, cuando estás haciendo cmp al, 47
y el contenido de AL
es igual a 47, el ZF está configurado, ergo, el salto (si no es igual – JNE) no debe tomarse.
Haré una respuesta un poco más amplia aquí.
En términos generales, hay dos tipos de saltos condicionales en x86:
-
Saltos aritméticos – como JZ (saltar si es cero), JC (saltar si llevar), JNC (saltar si no llevar), etc.
-
Saltos de comparación – JE (salto si es igual), JB (salto si es inferior), JAE (salto si es superior o igual), etc.
Entonces, use el primer tipo solo después de instrucciones aritméticas o lógicas:
sub eax, ebx
jnz .result_is_not_zero
and ecx, edx
jz .the_bit_is_not_set
Use el segundo grupo solo después de las instrucciones de CMP:
cmp eax, ebx
jne .eax_is_not_equal_to_ebx
cmp ecx, edx
ja .ecx_is_above_than_edx
De esta manera, el programa se vuelve más legible y nunca se confundirá.
Tenga en cuenta que, a veces, estas instrucciones son en realidad sinónimos. JZ == JE; JC == JB; JNC == JAE y así sucesivamente. La tabla completa es la siguiente. Como puede ver, solo hay 16 instrucciones de salto condicional, pero 30 mnemónicos: se proporcionan para permitir la creación de un código fuente más legible:
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 and 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
Al principio parece que JNZ significa saltar si no es cero (0), como en salto si la bandera cero es 1/set.
Pero en realidad significa Salto (si) no Cero (está configurado).
Si 0 = no establecido y 1 = establecido, recuerde:
JNZ salta si la bandera cero no está configurada (0)
valoraciones y reseñas
Te invitamos a añadir valor a nuestro contenido informacional añadiendo tu veteranía en los comentarios.