PC-zugeordnete Erweiterungen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu 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.