PC-zugeordnete Erweiterungen
Nach oben zu Mac OS X-Anwendungsentwicklung
Mac- und Linux-Systeme verwenden Programmzählern (Program Counter, PC) zugeordnete Exceptions. Windows (Win32) verwendet auf dem Stack gelinkte Registrierungs-Records.
Abwickeln von Assembly-Routinen
Assembly-Routinen können keine Exceptions abfangen. Zudem müssen Sie beim Aufrufen von Assembly-Routinen wegen der Abwicklungsbesonderheiten vorsichtig sein. Dieser Aspekt ist für den Fall wichtig, dass Nicht-Assembly-Code Assembly-Code aufruft, der wiederum Nicht-Assembly-Code aufruft. Wenn eine Exception ausgelöst wird, verwirft der Stack-Abwicklungsprozess Stack-Frames, die die Exception übergeben. Der Abwicklungsprozess muss bei seiner Ausführung verschiedene kritische Register wiederherstellen. Dazu gehören der Stack-Zeiger und der Frame-Zeiger. Es besteht die Möglichkeit, durch bestimmten Assembly-Code diesen Abwicklungsprozess zu verhindern. Sie sollten dies unbedingt vermeiden. Ein wichtiger Aspekt ist, dass beim Ändern des Stack-Zeigers um eine variable Größe der Abwicklungsprozess den Frame nicht ohne Hilfe abwickeln kann. Zum Beispiel:
sub esp, eax
oder
sub esp, 0xF
and esp, 0xFFFFFFF0
Jedes dieser Konstrukte im Assembly-Code verhindert, dass der Abwicklungsprozess die angegebene Prozedur abwickeln kann. Zur Abwicklung von Prozeduren mit solchen Anweisungen müssen Sie einen Stack-Frame in Ihren Code einfügen:
push ebp
mov ebp, esp
Die beiden ersten Anweisungen Ihres Codes müssen die Erstellung des Stack-Frames betreffen. Beim Compilieren des Assembly-Codes wird diese Anweisungssequenz vom Compiler erkannt, und der Compiler erzeugt spezielle Abwicklungsinformationen für die Routine. Wenn der Frame nicht vorhanden ist, untersucht der Compiler die gesamte Assembly-Routine und versucht zu analysieren, wie der Code den Stack verändert, damit die Änderungen bei einer ausgelösten Exception abgewickelt werden können.