Exceptions

WRITEME noch nicht ganz vollständig

Ein Exception ist ein Ereignis das durch einen Zustand ausgelöst wird, der meistens nicht erwartet wird oder einen Fehler darstellt. Dieses Ereignis wird an das Programm zurückgeben und dieses kann dann darauf mit einem Fehlerhandling reagieren.
Da es verschiedene Modi der Codeausführung gibt, sind die Listen der Übersichtlichkeit halber getrennt.

Protected Mode

ModisBedeutung
Protected Mode?+
Real Mode?+
Virtual-8086 Mode?+

Exceptions

CPU
#DE0Divide Error
#DB1Debug
#BP3BreakPoint
#OF4Overflow
#BR5BoundRange Exceeded
#UO6Invalid OpCode
#NM7Device Not Available
#DF8Double Fault
#??9CoProcessor Segement Overrun
#TS10Incalid TSS
#NP11Segment Not Present
#SS12Stack Fault
#GP13General Protection
#PF14Page Fault
#MF16FPU FloatingPoint Error
#AC17Alignment Check
#MC18Machine Check
FPU FloatingPoint Exceptions
#IS?+Stack Overflow oder Unterflow
#IA?+Invalid Arithmetic Oeration
#D?+Denormal Operation
#Z?+Divide by 0
#O?+Numeric Overflow
#U?+Numeric Unterflow
#P?+Inexact Result
SIMD FloatingPoint Exceptions
#I?+Invalid Operation
#Z?+Divide by 0
#D?+Denormal Operation
#O?+Numeric Overflow
#U?+Numeric Unterflow
#P?+Inexact Result

Exceptions Codes

#AC
1Der Alignment-Check ist aktiviert, der CPL ist 3, und es wird ein nicht ausgerichtetes Datum vorgefunden.
#BR
1Das Testergebnis liegt außerhalb der im Operanden vorgegebenen Grenzen.
#DB
1Das GD-Flag in Debug-Register DR7 ist gesetzt, und es wird auf ein Debug-Register zugegriffen.
#DE
1Der Operand hat den Wert $00.
2Der Divisor (Quelloperand) hat den Wert $00.
3Das Ergebnis ist im Format des Zieloperanden nicht darstellbar.
#GP
Allgemein
1Der Protected-Mode ist nicht aktiv.
2Die Funktion kann im Virtual-8086-Mode nicht ausgeführt werden.
Null-Selektoren
3Auf das DS-, ES-, FS- oder GS-Register wird zugegriffen, der enthaltene Selektor ist aber ein Null-Selektor.
4Der im Zieloperanden, Interrupt-Gate, Trap-Gate, Call-Gate, Task-Gate oder Task-State-Segment verzeichnete Selektor ist ein Null-Selektor.
5Der im Gate verzeichnete Selektor für das Codesegment ist ein Null-Selektor.
6Der in das SS-Register zu ladende Selektor ist ein Null-Selektor.
7Die Ziel-/Rücksprungadresse ist Null, oder der Selektor für das Stacksegment ist ein Null-Selektor.
Grenzüberschreitungen
8Die verwendete Speicheradresse liegt außerhalb des durch den Selektor in CS, DS, ES, FS oder GS ausgewählten Segments.
9Die verwendete Speicheradresse liegt außerhalb des adressierbaren Bereichs von $0000 bis $FFFF.
10Die Rücksprungadresse bzw. die Zieladresse im Operanden, Call-Gate oder Task-Switch-State liegt nicht im anzuspringenden Codesegment.
11Die Zieladresse im Codesegment liegt außerhalb des adressierbaren Bereichs von $0000 bis $FFFF für das Codesegment, weil ein ADRSIZE-Präfix verwendet wurde.
12Der Selektor für das Codesegment, das Gate oder den Task-Switch-State zeigt nicht in eine Deskriptortabelle.
13Der Selektor für das Codesegment oder Stacksegment für den Rücksprung zeigt nicht in eine Deskriptortabelle.
14Der Selektor zeigt auf einen Eintrag außerhalb der verwendeten Tabelle.
15Der Selektor zeigt auf eine LDT oder eine Stelle außerhalb der GDT.
16Eine Interruptnummer zeigt auf einen Vektor außerhalb der IDT.
17Die Einsprungadresse in der IDT, im Interrupt-Gate, Trap-Gate oder Task-Gate liegt nicht in einem Codesegment.
18Das EBP-Register zeigt auf eine Adresse, die außerhalb des Stack-Segments liegt.
19Das EBP-Register zeigt auf eine Adresse, die außerhalb des adressierbaren Bereichs von $0000 bis $FFFF liegt.
Falsche Segmente
20Das Ziel der Operation liegt in einem als non-writable markierten Segment.
21Der Selektor, der in das SS-Register geladen werden soll, zeigt auf ein als non-writable markiertes Segment.
22Der Selektor, der in das DS-, ES-, FS- oder GS-Register geladen werden soll, zeigt nicht auf ein als readable markiertes Code- oder Datensegment.
23Der Selektor im Operanden zeigt nicht auf ein conforming oder non-conforming Code-Segment, auf ein Call-Gate, Task-Gate oder ein Task-Switch segment.
24Der Selektor eines Call-Gates, Interrupt-Gates oder Trap-Gates zeigt nicht auf ein Code-Segment.
25Der Selektor im Operanden zeigt nicht auf einen GDT-Eintrag, oder der selektierte GDT- Eintrag zeigt nicht auf eine LDT.
26Der Selektor in einem Task-Gate zeigt auf ein Task-Switch segment, das als not present markiert ist.
27Das Stacksegment ist kein als writable markiertes Datensegment.
28Der Deskriptor eines Codesegments enthält nicht die Typinformation für ein Code-Segment.
29Der Deskriptor, auf den der Selektor der Rücksprungadresse zeigt, beschreibt kein Codesegment.
30Der Deskriptor in der IDT beschreibt keine Interrupt-Gate, Trap-Gate oder Task-Gate.
Privilegverletzungen
31Der IOPL ist kleiner als 3, oder der DPL des Interrupt-, Trap- oder Task-Gate-Deskriptors ist nicht gleich 3.
32Der CPL ist größer als 0.
33Der CPL ist größer als der IOPL (I/O-Privileg-Level) des aktuellen Programms oder der aktuellen Prozedur
34Der CPL ist größer als der IOPL (I/O-Privileg-Level), und irgendeines der Permission-Bits im TSS für den angesprochenen Port ist gesetzt.
35Der DPL im anzuspringenden non-conforming Codesegment ist nicht gleich dem CPL, oder der RPL des Selektors in der Ziel- oder Rücksprungadresse ist größer als der CPL.
36Der DPL im anzuspringenden conforming Codesegment ist größer als der CPL.
37Der DPL im anzuspringenden conforming Codesegment ist größer als der RPL im Selektor der Rücksprungadresse.
38Der DPL des Codesegments, auf das ein Call-Gate zeigt, ist größer als der CPL.
39Der DPL des Stacksegments ist nicht gleich dem RPL im Selektor der Rücksprungadresse.
40Der DPL eines Call-Gates, Task-Gates oder eines Task-Switch-State ist kleiner als der CPL oder als der RPL des betreffenden Selektors.
41Der DPL ist kleiner als der CPL und der RPL des Selektors, der in das DS-, ES- FS- oder GS-Register geladen wird. Dies ist eine Schutzverletzung, obwohl der Selektor auf ein Daten- oder non-conforming Codesegment zeigt.
42Der DPL des Interrupt-Gates, Trap-Gates oder Task-Gates, der durch Auslösen des INT n-Funktion (auch INT3 und INTO) verwendet werden soll, ist kleiner als der CPL.
43Der RPL des Selektors in der Ziel- oder Rücksprungadresse ist größer als der CPL.
44Der RPL des Selektors der Rücksprungadresse ist kleiner als das CPL.
45Der RPL im Selektor des Stacksegments und der Rücksprungadresse sind verschieden.
46Das SS-Register wird mit einem Selektor geladen, dessen RPL nicht gleich dem DPL des Segments und dem CPL ist.
Falsche Bitstellungen
47Das Global/local-Flag im Selektor eines Task-Switch-States steht auf �local�.
48Ein Permission-Bit im Task-Switch-State für den angesprochenen Port ist gesetzt.
49Versuch, eine ungültige Bitkombination in CR0 zu schreiben (zB. PG = 1 und PE = 0 oder CD = 0 und NE = 1).
50Versuch, ein Bit im Kontrollregister CR4 zu setzen.
51Versuch, in der Pointer-Tabelle eines Page-Directory-Eintrages reservierte Bits für die Nutzung der Physical-Address-Extension zu setzen, wenn PAE in Kontrollregister CR4 und PG in Kontrollregister CR0 gesetzt sind.
52Der CPL ist größer als 0, und das PCE-Flag in Kontrollregister CR4 ist gelöscht.
53Das PCE-Flag in Kontrollregister CR4 ist gelöscht.
54Der CPL ist größer als 0, und das TSD-Flag in Kontrollregister CR4 ist gesetzt.
55Das TDS-Flag in Kontrollregister CR4 ist gesetzt.
Ungültige Operanden/Funktionen
56Auf die Debugregister kann in dieser Betriebsart nicht zugegriffen werden.
57POPF/POPFD wurde mit einem OPSIZE-Präfix versehen.
58Das SP-bzw. ESP-Register enthält den Wert 7, 9, 11, 13, oder 15.
59Der Inhalt von ECX codiert ein reserviertes oder nicht implementiertes modellspezifisches Register (MSR).
60Der Wert in ECX ist nicht 0 oder 1.
61Das modellspezifische Register (MSR) SYSENTER_CS_MSR enthält den Wert 0.
Inkonsistenzen
62Beim Laden des SS-Registers wird eine Fehlerursache vorgefunden: Der Selektor zeigt nicht in die GDT, der RPL des Selektors ist nicht gleich dem CPL, das als Stack verwendete Datensegment ist als non-writable markiert, oder der DPL des Segments ist nich
63Beim Laden des DS-, ES-, FS- oder GS-Registers wird folgende Fehlerursache vorgefunden: Der Selektor ist ein Null-Selektor oder zeigt nicht in die GDT, das Segment ist kein Daten- oder readable Codesegment, oder das Segment ist zwar ein Daten- oder non-
64Der Deskriptor weist seinen Task-Switch-State als busy oder nicht verfügbar aus.
65Der Selektor im Quelloperanden zeigt auf ein Segment, das kein Task-Switch-State (TSS) ist oder aber auf ein TSS, das zu einem gerade aktiven Task gehört.
66Das Codesegment der Rücksprungadresse ist non-conforming, und sein DPL ist nicht gleich dem RPL des Selektors für das Codesegment.
67Das Codesegment der Rücksprungadresse ist conforming, und sein DPL ist größer als der RPL des Selektors für das Codesegment.
#MF
1Eine FPU-Exception wartet auf die Behandlung.
#NM
1Das TS-Flag in Kontrollregister CR0 ist gesetzt.
2Das EM-Flag oder das TS-Flag in Kontrollregister CR0 ist gesetzt.
3Das MP-Flag und das TS-Flag in Kontrollregister CR0 sind gesetzt.
#NP
1Ein Codesegment, Datensegment, Stacksegment oder ein Call-Gate, Task-Gate oder Task-State-Segment (TSS) sind als not present markiert.
2Der LDT-Deskriptor in der GDT ist als not present markiert.
3Das Task-State-Segment ist als not present markiert.
4Der nach DS, ES, FS oder GS zu ladende Selektor zeigt auf ein Segment, das als not present markiert ist.
#PF
1Beim Versuch, auf eine Page zuzugreifen, wurde ein Fehler entdeckt.
#SS
1Die verwendete Speicheradresse liegt außerhalb des durch den Selektor in SS ausgewählten Segments.
2Der neu geladene Wert im SS- oder ESP-Register weist auf Adressen, die außerhalb der Stacksegmentgrenzen liegen.
3Das Ablegen von Daten auf dem Stack sprengt die Grenzen des Stacksegments.
4Das Ablegen einer Rücksprungadresse und/oder Flags und/oder eines Fehlercodes sprengt die Grenzen des Stacksegments.
5Das Ablegen einer Rücksprungadresse und/oder Parameter und/oder Stackpointer auf den Stack, ohne daß ein Task-Switch stattfindet, führt zum Überschreiten der Grenzen des Stacksegments.
6Das Ablegen einer Rücksprungadresse und/oder Parameter und/oder Stackpointer auf den Stack bei einem Task-Switch führt zum Überschreiten der Grenzen des Stacksegments.
7Das SS-Register wird mit einem Selektor geladen, dessen dazugehöriges Segment als not present markiert ist.
8Das SS-Register wird im Rahmen eines Task-Switchs mit einem Selektor geladen, dessen dazugehöriges Segment als not present markiert ist.
9Die Stackspitze liegt außerhalb der Segmentgrenzen des Stacksegments.
10Stackspitze und StackByteasis liegen außerhalb der Segmentgrenzen des Stacksegments.
#TS
1Der Selektor für das Stacksegment ist ein Null-Selektor.
2SS:ESP liegt außerhalb des TSS.
3Der RPL des im TSS verzeichneten Selektors für das Stacksegment ist nicht gleich dem DPL des Codesegments, auf das umgeschaltet wird.
4Der DPL des neuen Stacksegments, auf das der Selektor im TSS zeigt, ist nicht gleich dem DPL des neuen Codesegments.
5Das neue Stacksegment nicht kein als writable markiertes Datensegment.
6Der Selektor für ein Stacksegment zeigt nicht in eine Deskriptortabelle.
#DU
1Die Funktion ist in diesem Modus nicht verfügbar.
2Der Quelloperand ist keine Speicherstelle.
3Der Zieloperand ist kein Register.
4Der Zieloperand ist ein Register.
5Der Zieloperand ist keine Speicherstelle.
6Das EM-Flag in Kontrollregister CR0 ist gesetzt.
7Das Präfix kann nicht in Verbindung mit der sich anschließenden Funktion eingesetzt werden.
8Das CS-Register soll geladen werden.
9Das DE-Flag in Kontrollregister CR4 ist gesetzt, und ein Operand bezeichnet die Debugregister DR4 oder DR5.
10Der Prozessor ist bei Ausführung der Funktion nicht im System-Management-Mode (SMM).
11Die Exception wird mit Sicherheit ausgeführt.


Protected Mode

WRITEME

Real Mode

WRITEME

Virtual-8086 Mode

WRITEME


Assembler/Funktionen/Exceptions.txt · Zuletzt geändert: 2009/05/08 19:46 (Externe Bearbeitung)