Saltar al contenido

Instrucciones de montaje JNZ y CMP

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:

  1. Saltos aritméticos – como JZ (saltar si es cero), JC (saltar si llevar), JNC (saltar si no llevar), etc.

  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *