2012-03-20 17 views
6

Acabo de abrir un archivo en IDA Pro y encontré un código que parece completamente inútil. Sin embargo, pensé que podría ser útil. ¿El sub eax,0 no resta 0 de eax?sub eax, 0 - ¿Hace algo?

El código:

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

Sí, resta cero de eax. Pero eso * sí * hace algo, establece las banderas. Por ejemplo, la única forma en que resultará en cero es si eax fue cero para comenzar. – harold

Respuesta

13

La instrucción sub establece marcas (OF, SF, ZF, AF, PF y CF, de acuerdo con el documentation) - la instrucción mov no. El jz saltará solo si se establece el indicador de cero (ZF), por lo que si desea saltar en función del valor en eax, ese indicador debe establecerse correctamente.

+0

Pensé que necesitabas usar la instrucción TEST para eso. ¡Gracias! –

+1

'test' hace un Y a nivel de bits implícito, pero no afecta a todos los mismos indicadores. De los documentos 'test':" Los indicadores 'OF' y' CF' se establecen en '0'. Los indicadores' SF', 'ZF', y' PF' se establecen de acuerdo con el resultado ... El estado de la bandera 'AF' no está definida. –

6

La instrucción sub establecerá el indicador de cero si su resultado es cero. En este caso, esto significa que se establecerá el indicador de cero si eax es cero.

Estas tres instrucciones comprueban si [esp+fdwReason] es cero y salta a loc_10001038 en ese caso.

Cuestiones relacionadas