2009-01-22 5 views
7

Ich debugging meinen Code auf x86 und das Problem verfolgt bis AND Befehl manchmal ZF-Flag nicht gelöscht, wenn das Ergebnis nicht Null ist. Hier ist das problematische Stück Code:x86: ZF wird nicht immer von AND aktualisiert?

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

ich einen Haltepunkt nach und für das Debuggen hinzugefügt. Wenn es auf dem Haltepunkt EDX == 0x80000 und ZF == 1 stoppt. Aber ZF sollte gelöscht werden, wenn EDX! = 0. Der Code funktioniert einwandfrei, wenn Sie den Debugger einzeln ausführen, aber er schlägt während des normalen Laufs nicht ordnungsgemäß.

Hier ist eine screenshot der Debugger-Sitzung.

Irgendwelche Hinweise?

Wenn das wichtig ist, wird der Code von JIT generiert, also führe ich Daten aus.

Vielen Dank im Voraus.

Antwort

1

Entsprechend der Intel Befehlssatzreferenz wird ZF immer entsprechend dem Ergebnis gesetzt. Könnte etwas im int 3-Handler das manipulieren?

Edit: Nach weiterem Durcharbeiten der Handbücher (Gott sei Dank, dass Intel freie Kopien verschickt!), Sind meine einzigen Ideen, dass es entweder der int 3-Handler ist, oder der Prozessor nur dx statt edx anschaut Flaggen setzen. Beide scheinen unwahrscheinlich, aber letzteres erscheint völlig unplausibel. In welchem ​​Modus laufen Sie? (Echt, geschützt, unwirklich, lang?)

2

Sie können den int 3-Handler leicht untersuchen, um zu sehen, ob er mit iret zurückkehrt (dh die Caller-Flags zurückspringen) oder wenn er mit retf 2 zurückkehrt der Handler).

0

Es könnte sein, dass Ihr Debugger etwas Besonderes macht, wie zum Beispiel das Synchronisieren von Memeroy und Registern. Wenn Sie es ohne den Debugger ausführen, scheitern Sie sagen?

4

Danke an alle. Es war meine Schuld, entschuldigen Sie die Störung. Es gibt eine Verzweigung zu 'int 3' von einem anderen Ort. Aus diesem Grund sind die Flags nicht mit den Anweisungen vor 'int 3' konsistent. Ich war verwirrt, zu diesem Zeitpunkt immer edx == 0x80000. Entschuldigung nochmal.

+0

Keine Notwendigkeit zu entschuldigen, wir waren alle da :) –

+3

+1 für die Rückkehr an den Tatort und gestehen. –