elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 03:01  


Tema destacado: Entra al canal IRC oficial de #elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: Shaddy, karmany)
| | |-+  Problemas con TEST y el flag Z
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problemas con TEST y el flag Z  (Leído 935 veces)
Tinkipinki

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Problemas con TEST y el flag Z
« en: 9 Noviembre 2011, 09:36 »

Hola a todos:
Tengo el siguente codigo:

Código:
PUSH EDI                               
 MOV EDI,DWORD PTR SS:[ARG.2]
 TEST EDI,EDI
JNE SHORT 0040100D

Antes del TEST EDI=00000007
Una vez pasado el TEST el flag Z se pone a 0

Pero si miro la funcion TEST me dice que:

Citar
1 and 1 = 1   Flag FZ =1
1 and 0 = 0   Flag FZ =0
0 and 1 = 0   Flag FZ =0
0 and 0 = 0   Flag FZ =0

Entonces si EDI vale 7 porque se pone el flag Z a 0 ?

Saludos
En línea
PeterPunk77

Desconectado Desconectado

Mensajes: 64



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #1 en: 9 Noviembre 2011, 12:49 »

Buenas Tinkipinki,
pues precisamente porque "1 AND 1 = 1". Por lo tanto, como te queda "EDI = 7", "EDI <> 0" -> "FZ = 0"

El flag Z se pone a 1, si el resultado de la operación realizada deja a 0 el registro destino (bueno, el "test" es igual que el "and" pero descartando el resultado), así que lo veremos mejor con unos ejemplos:

EAX = 0
EDX = 7
test eax, edx
ZF = 1 (el resultado sería eax = 0)

eax = 0x10
edx = 0x17
test eax, edx
ZF = 0 (el resultado sería eax = 0x10)

eax = 1
test eax, eax
ZF = 0 (el resultado sería eax = 1)

eax = 0
test eax, eax
ZF = 1 (el resultado sería eax = 0)

Saludos.

En línea

Tinkipinki

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #2 en: 9 Noviembre 2011, 15:06 »

PeterPunk77 gracias por contestar.
Usando las tablas de bits me ha liado un poco pero con tu ejemplo me queda ya mas claro.

Por lo que he podido entender el fag Z solo se pondra a 1 solamente si los dos datos comparados valen 1, para cualquier otro valor sea 0, 7, 10h, ..etc se pondra a 0.

En las tablas me confundia ya que decia:
1-1 = 1 -> Aqui yo creia que cualquier <> 0 =1 por lo tanto 7-7 = 1

Saludos
En línea
PeterPunk77

Desconectado Desconectado

Mensajes: 64



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #3 en: 9 Noviembre 2011, 16:04 »

Perdona Tinkipinki pero o no te he entendido bien esto último o no me he sabido explicar bien antes.
El flag Z sólo se pone a 1 si la instrucción deja el registro destino a 0.

Mäs ejemplos:

eax = 1234
xor eax, eax
ZF = 1 (eax queda a 0)

eax = 1234
ebx = 2345
xor eax, ebx
ZF = 0 (eax queda distinto de 0)

eax = 8
ebx = 5
sub eax, ebx
ZF = 0 (eax queda a 3)

eax = 1
dec eax
ZF = 1 (eax queda a 0)

Y en el caso del TEST (y obviamente del AND) se pondrá a 0 cuando no coincida ningún bit en los operandos:

eax = 0x1234 (0001001000110100)
ebx = 0x2345 (0010001101000101)
test eax, ebx
ZF = 0 (queda  0000001000000100 = 0x204)

eax = 0x5678 (0101011001111000)
ebx = 0x2184 (0010000110000100)
test eax, ebx
ZF = 1 (queda  0000000000000000 = 0)

Saludos.
En línea

MCKSys Argentina


Desconectado Desconectado

Mensajes: 1.222


Diviérte crackeando, que para eso estamos!


Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #4 en: 9 Noviembre 2011, 17:18 »

Como te ha dicho PeterPunk77, TEST es un AND que descarta el resultado.

En este caso, donde los operandos son el mismo registro, el ZF se va a poner en 1 solo cuando el registro (EDI) sea 0. En cualquier otra caso, el ZF va a valer 0.

Seria lo mismo que hacer CMP EDI, 0

Saludos!
« Última modificación: 9 Noviembre 2011, 17:24 por MCKSys Argentina » En línea

---------------------
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."
Tinkipinki

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #5 en: 9 Noviembre 2011, 19:16 »

Puff....!!  Me ha costado pero ya me ha quedado claro.
Me he pegado el gran lio con la tabla de comparaciones de bits confundiendo valores con bits.

Gracias a todos

En línea
_Enko


Desconectado Desconectado

Mensajes: 301



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #6 en: 10 Noviembre 2011, 14:00 »

Citar
En este caso, donde los operandos son el mismo registro, el ZF se va a poner en 1 solo cuando el registro (EDI) sea 0. En cualquier otra caso, el ZF va a valer 0
ZF se pone en 1 cuando  una instruccion que modifique las banderas de como resultado 0.
Hay instrucciones que modifican las banderas, pero no se utilizan con ese proposito, sino que se les agrega un test igualmente dependiendo de la optimizacion del compilador.
Por ejemplo
Código
       	mov     eax, 1
test    eax, eax ; ZF = 0, resultado del test no es 0
dec     eax ; ZF = 1, el resultado de 1-1 es 0.
je .salto ; el salto se realiza
 
Si el compilador estaria mal optimizado, despues del dec eax, habria un "cmp eax, 0" o un "test eax, 0"



« Última modificación: 10 Noviembre 2011, 14:03 por _Enko » En línea


Servicio tecnico Blackberry http://www.serviciotecnicocelular.com
Tinkipinki

Desconectado Desconectado

Mensajes: 209



Ver Perfil
Re: Problemas con TEST y el flag Z
« Respuesta #7 en: 11 Noviembre 2011, 00:06 »

Ok Enko.
Me había quedado encasqiillado en la operativa de bits y dale que dale a que si 1-1 flag 1..  :P y de ahí no salia. Por suerte con la paciencia y los ejemplos de PeterPunk77 mas los comentarios de MCKSys Argentina, al final me hicieron ver la luz.
Encuentro que el tema de los flags es una cosa muy interesante y que no le había prestado demasiada atencion hasta ahora.

Saludos
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
FLAG
Programación General
newone 3 2,327 Último mensaje 28 Julio 2007, 19:37
por NekroByte
como funcion a un flag
Programación C/C++
tomkat 2 1,367 Último mensaje 14 Septiembre 2008, 20:37
por Eternal Idol
Test: friki test, descupre si eres todo un geek
Foro Libre
MasterPM2 0 687 Último mensaje 25 Octubre 2009, 07:38
por MasterPM2
Problemas con flag carry
ASM
Tyrz 1 2,021 Último mensaje 18 Octubre 2010, 08:21
por kernel19
error bad flag
Programación C/C++
boticheliss 0 924 Último mensaje 17 Enero 2011, 11:10
por boticheliss
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines