tutorial registers lenguaje language instruction ensamblador assembly x86

assembly - registers - lenguaje ensamblador x86



x86: ZF no siempre actualizado por AND? (4)

Estoy depurando mi código en x86 y el problema rastrea a instrucciones AND a veces no borra la bandera de ZF si el resultado no es cero. Aquí está la pieza problemática de código:

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

Agregué 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 realiza un solo paso en el depurador, pero falla consistentemente durante la ejecución normal.

Aquí hay una captura de pantalla de la sesión del depurador.

¿Algún consejo?

Si eso es importante, JIT genera el código, entonces estoy ejecutando datos.

Gracias de antemano.


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 al enviar copias gratis!), Mi única idea es que sea el manejador int 3 configurándola de alguna manera, o el procesador solo mirando dx en lugar de edx al establecer flags. Ambos parecen poco probables, pero el último parece completamente inverosímil. ¿En qué modo estás corriendo? (Real, protegido, irreal, largo?)


Gracias a todos. Fue mi culpa, siento molestarte. 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 punto. Lo siento de nuevo.


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


Puede examinar fácilmente el manejador int 3 para ver si está volviendo con un iret (es decir, devolver las banderas de los llamantes) o si está regresando con retf 2 (es decir, preservar los indicadores del manejador).