int anweisung pushed zusätzliche bytes auf den stack
-
Moin!
Ich habe einen Interrupt mit mehreren funktionen geschrieben. Eine der funktionen ruft eine andere in diesem interrupt auf. Erst dachte ich, dass das wunderbar klappen müsste - denkst'e! Durch den zweiten Interrupt aufruf, pushed der Rechner ein weiteres, meiner meinung nach willkürliches word auf den Stack.
Ich möchste jetzt gerne wissen, warum?bspl:
hauptprogramm: mov ah, 0x01 int 0x21 ; mein Interrupt ; push offset; push segment; interrupt: ... cmp ah, 0x01 jne @f ;; wenn nicht 0x01 dann springe zum nächsten mov ah, 0x02 mov al, 123 int 0x21 ; wieder mein interrupt; push unbekanntes word; push offset; push segment ...
-
Er pusht die Flags. Das ist normal bei Interrupts. Kein Grund sich sorgen zu machen.
-
Und wieso macht er das nur, wenn ich den interrupt inerhalb des interrupts aufrufe? ich meine wenn ich innerhalb meines interrupts z.b. int 0x10, oder den interrupt außerhalb des interrupts aufrufe, dann macht der das net.
Also so ganz versteh ich noch nicht, welcher sinn dahinter steckt die flags zu pushen.
-
Hi.
Wenn dein CPU nicht immer bei einem Interruptaufruf neben der far-return-Adresse auch die Flags auf den Stack packen taete, koenntest du jetzt wohl nicht hier ins Forum schreiben...
Also ueberpruefe mal deinen Code... Vielleicht falsche ret-Anweisung am Ende des Interrupts benutzt?Zu Sinn und Zweck der Flags-Sicherung:
Wenn du zB. gerade ein cmp o.ae. ausgefuehrt hast und nun koemmt da ein IRQ, bevor die veraenderten Flags ausgewertet werden konnten... ...wuerden wohl eigenartige Sachen passieren, wenn dieser Interrupt jetzt einfach die Flags zerwurschtelt.
-
Wie springe ich denn dann richtig aus einem interrupt zurück? ich dachte ein retf genügt. Demnach reicht das dann doch nicht.
Es kann wohl sein, dass er bei jedem int-aufruf die flags pushed, ich aber nichts davon mitbekomme. ich lasse mir mit bochs einfach den stack ausgeben und da war alles vor der far-adresse 0. kann sein, dass die flags halt alle 0 waren. Wie ach immer.
Aber einige interrupte ändern ja die flags ganz bewusst - int 0x13 z.b. setzt das carry-flag bei fehlern. ich halte es für keine gute idee, wenn ich erst eine cmp-anweisung mache, dann einen interrupt auslöse und dann die cmp-anweisung auswerte. naja. wie auch immer, sollte ja nur ein beispiel sein.
__
Grüße, DennisB
-
Einen int 0x13 rufst du ja auch bewusst auf, der passiert nicht einfach.
Mit iret kehrst du zurück.
-
Mit iret kehrst du zurück.
Danke für die Info
Einen int 0x13 rufst du ja auch bewusst auf, der passiert nicht einfach.
Stimmt, daran habe ich gar nicht gedacht. Wenn ich z.B. meine Maus bewege, wird ja auch ein Interrupt ausgelöst.
Aber eine Frage habe ich dann doch noch mal, wenn ich nun ein Flag bewusst ändern möchte, gibt es da nen eleganten weg, oder setze ich dann einfach das entsprechende flag im word aufm stack?
__
Grüße, DennisB
-
DennisB schrieb:
oder setze ich dann einfach das entsprechende flag im word aufm stack?
So würd ich es jedenfalls machen.