Autor
|
Tema: Problemas con TEST y el flag Z (Leído 4,892 veces)
|
Tinkipinki
Desconectado
Mensajes: 242
|
Hola a todos: Tengo el siguente codigo: 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: 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
Mensajes: 77
|
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
Mensajes: 242
|
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
Mensajes: 77
|
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
|
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 pm 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
Mensajes: 242
|
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
|
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 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 pm por _Enko »
|
En línea
|
|
|
|
Tinkipinki
Desconectado
Mensajes: 242
|
Ok Enko. Me había quedado encasqiillado en la operativa de bits y dale que dale a que si 1-1 flag 1.. 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Problemas con flag carry
ASM
|
Tyrz
|
1
|
4,868
|
18 Octubre 2010, 08:21 am
por kernel19
|
|
|
error bad flag
Programación C/C++
|
boticheliss
|
0
|
2,697
|
17 Enero 2011, 11:10 am
por boticheliss
|
|
|
Modificar Flag de segmento TCP (.NET 2010)
.NET (C#, VB.NET, ASP)
|
__Alvaro 2015__
|
4
|
2,456
|
6 Febrero 2015, 22:53 pm
por __Alvaro 2015__
|
|
|
Problema Flag sección
Ingeniería Inversa
|
.:UND3R:.
|
2
|
2,351
|
23 Enero 2016, 06:17 am
por .:UND3R:.
|
|
|
que es capture the flag?
Hacking
|
str0nghack
|
2
|
3,581
|
7 Febrero 2017, 00:00 am
por str0nghack
|
|