x86 Ausnahmen und Flags

1370
user32569

bitte, ich weiß, dass, wenn Sie beispielsweise durch Null dividieren, das aproptiate-Flag im CPU-Flag-Register gesetzt wird. Aber heute habe ich gelesen, dass es spezielle Interrupt-Vektoren gibt (ich denke, die ersten 16 in IVT), die für solche Bedingungen wie das Teilen durch Null verwendet werden. Also, was ich fragen möchte, ist, löst eine Situation, in der ein Flag geändert wird, auch eine geeignete Unterbrechung aus? In der Schule benutzten wir bedingte Sprünge, bei denen überprüft wurde, ob das Flag für das Tragen gesetzt wurde oder nicht, und ich erinnere mich nicht, dass dadurch ein Interrupt ausgelöst wurde. Ich bin jetzt ziemlich verwirrt.

3
Minimale 16-Bit-Realmodus-Division durch Null-Interrupt-Beispiel: https://github.com/cirosantilli/x86-bare-metal-examples/blob/9e58c1dc656dab54aa69daa38f84eb8c0aa6151e/interrupt_zero_divide.S 32-Bit-Version: https://gith.com/ Cirosantilli / x86-Bare-Metal-Beispiele / Blob / 9e58c1dc656dab54aa69daa38f84eb8c0aa6151e / idt.S Ciro Santilli 新疆改造中心 六四事件 法轮功 vor 8 Jahren 0

1 Antwort auf die Frage

3
qbeuek

Es gibt zwei Arten von Interrupts.

Der erste Typ sind Interrupts zum Signalisieren von Hardwareereignissen, z. B. wenn der Hardware-Timer abgelaufen ist oder der Festplattencontroller die Übertragung von Daten in den Speicher beendet hat.

Der zweite Typ sind Interrupts zum Signalisieren eines unerwarteten Zustands. Einige Beispiele sind: Zugriff auf ungültigen Speicher, Division durch Null (eigentlich ist es "Divisionsüberlauf", der nicht nur auftritt, wenn Sie durch Null dividieren, sondern auch, wenn Sie einen sehr großen Wert durch einen sehr kleinen Wert teilen), Haltepunktbefehl, Hardware-Haltepunkt usw. Diese Art von Ausnahmen wird von der CPU ausgelöst, wenn sie die aktuelle Anweisung nicht abschließen kann und in der Regel dazu führt, dass der aktuelle Prozess beendet oder der Debugger aufgerufen wird. Sie haben eigentlich nichts mit CPU-Flags zu tun, die die Ergebnisse der letzten Anweisung enthalten.