Hi!
Wenn Du mit
INT 21h
einen DOS-Interrupt aufrufst, dann passiert mit dem Stack und dem Aufruf genau das selbe, als ob der Prozessor einen Hardware-Interrupt ausführt. Ersatz-„Schau“-Bild:
PUSHF
CALLF [IntVec]
Du mußt bei jeder Interrupt-Service-Routine (egal ob Hardware- oder Software-Interrupt) immer mit
IRET
beenden.
Das muß auch der INT21, was er aber nicht tut. Natürlich nicht, einige DOS-Funktionen geben ja einen eventuellen Fehler im Carry-Flag zurück. Da tut er vor dem IRET (wenns überhaupt sowas is und kein normaler RET) aufm Stack rumschreiben. Und zwar genau das eine WORD, wo die Flags drin sind.
Das mit dem Hardware-Interrupt 00h-0Fh ist nicht ganz richtig. Das sind die Exceptions! Das sind „Fehlermeldungen“ direkt vom Prozessor. In Windows ein „Allgemeiner Ausnahmefehler“ ist sowas zB.
Intel hat schon beim 8088 (der Urvater vom 80386) schon gesagt, daß sie sich die Interrupts 00h-1Fh reservieren, die soll niemand verwenden. Die Deppen von IBM-PC-Erfinder haben aber dagegen verstoßen und die Hardware-Interrupts im PC (und später auch im AT) auf 08h-0Fh gelegt. Darum gibts da immer Konflikte mit den Exceptions, die (weil sich Intel das ja reserviert hat) die selben Interrupt-Nummern verwenden. Ab dem AT ist dann ein zweiter Interrupt-Controller eingebaut, der den Bereich A0h-A8h macht. Das is ok.
Aber nochmal: Hardware- und Software-Intertupts verhalten sich am Stack exakt gleich.
Bye
Hansi