2009-01-22 11 views
7

Estoy depurando mi código en x86 y el problema rastrea hasta AND instrucción a veces no borra la bandera ZF si el resultado no es cero. Aquí está la pieza de código problemática:x86: ZF no siempre se actualiza por Y?

 
0257A9F9 mov   edx,dword ptr [ecx+18h] 
0257A9FC and   edx,80000h 
0257AA02 int   3  
0257AA03 je   0257AA2A 

que añade un punto de interrupción después de Y para la depuración. Cuando se detiene en el punto de interrupción EDX == 0x80000 y ZF == 1. Pero ZF debe borrarse si EDX! = 0. El código funciona perfectamente bien cuando se ingresa solo en el depurador, pero falla consistentemente durante la ejecución normal.

Aquí hay una sesión de depurador screenshot.

¿Alguna pista?

Si eso importa, el código es generado por JIT, entonces estoy ejecutando datos.

Gracias de antemano.

Respuesta

1

De acuerdo con la referencia del conjunto de instrucciones Intel, ZF siempre se establece de acuerdo con el resultado. ¿Podría algo en el controlador int 3 manipular esto?

Editar: Después de profundizar en los manuales (gracias a Dios por Intel enviando copias gratis!), Mi única idea es que sea el controlador int 3 configurándolo de alguna manera, o el procesador solo mirando dx en lugar de edx cuando establecer banderas. Ambos parecen poco probables, pero el último parece completamente inverosímil. ¿En qué modo estás corriendo? (Real, protegido, irreal, largo?)

2

Puede examinar fácilmente el controlador int 3 para ver si está regresando con un iret (es decir, volver las banderas de las personas que llaman) o si regresa con retf 2 (es decir, conservar las banderas de el controlador).

0

Podría ser que su depurador esté haciendo algo especial, como sincronizar el memeroy y registrarlo. Cuando lo ejecutas sin el depurador, ¿fallas?

4

Gracias a todos. Fue mi culpa, lo siento molestarlo. Hay una rama a 'int 3' desde otro lugar. Es por eso que las banderas son inconsistentes con las instrucciones antes de 'int 3'. Estaba confundido por tener siempre edx == 0x80000 en este momento. Lo siento de nuevo.

+0

No hay necesidad de disculparse, todos hemos estado allí :) –

+3

+1 por volver a la escena del crimen y confesar. –

Cuestiones relacionadas