2010-06-06 10 views
5

Después de usar IDA Pro desmontar un DLL x 86, me encontré con este código (Los comentarios añadidos por mí en código pusedo-c Espero que sean correctos.):x86 jnz después de xor?

test ebx, ebx  ; if (ebx == false) 
jz  short loc_6385A34B ; Jump to 0x6385a34b 
mov  eax, [ebx+84h] ; eax = *(ebx+0x84) 
mov  ecx, [esi+84h] ; ecx = *(esi+0x84) 
mov  al, [eax+30h] ; al = *(*(ebx+0x84)+0x30) 
xor  al, [ecx+30h] ; al = al XOR *(*(esi+0x84)+0x30) 
jnz  loc_6385A453 

Vamos a hacer que sea más fácil de entender para mí :

mov  eax, b3h 
xor  eax, d6h 
jnz  ... 

¿Cómo funciona la instrucción de salto condicional después de una instrucción xor?

Respuesta

10

Al igual que la mayoría de las instrucciones, xor establece los indicadores de condición del procesador en función del resultado de la operación anterior. En este caso, la bandera Z se establecerá si el resultado de xor es cero. La instrucción jnz prueba la bandera Z y las ramas si es y no conjunto.

+0

¿Entonces también se aplica a otras instrucciones lógicas? –

+0

@ kotarou3: Sí, los indicadores se establecen como resultado de prácticamente todas las operaciones aritméticas y lógicas. –

3

que apenas conozco ensamblaje en absoluto, sino xor en este contexto hace más o menos lo mismo que cmp yo diría que, además de fijar eax al resultado de la operación XOR.

En otras palabras, después de xor, eax será 0 exactamente si su valor anterior era d6h (de lo contrario, será algún valor! = 0). Y adicionalmente, se establecerá el indicador de cero (como con cmp) para que pueda jnz probar ese indicador.

3

Saltará si el valor en eax no termina en cero.

Su segundo ejemplo no le hace justicia al código ya que el código que tiene está usando valores constantes, no valores cargados desde la memoria.

En el primer ejemplo, carga todos esos valores de la memoria y realiza el xor en eso. Los contenidos de la memoria pueden, a diferencia de su segundo ejemplo, cambiar en cada ejecución dependiendo de lo que hay en [ebx+84h] y [esi+84h].

Consulte xor y jnz para obtener más información.

+0

Gracias por los enlaces, encontré ese sitio web en algún lugar pero lo perdí nuevamente –

0

operaciones aritméticas como xor establecer indicadores de comparación (al igual que una instrucción de comparación).

0

Bueno, JNZ es un salto condicional, específicamente, salto si no es cero.

XOR (y muchas otras operaciones aritméticas/lógicas) establecerán el indicador de cero del registro de estado si el resultado de la operación es cero. Entonces en tu caso, está diciendo "do XOR, y si el resultado no es cero (es decir, si los dos números son diferentes) salta a esta ubicación.