Dies sind gas
Implementierung von MASM frame handling pseudos zum Erzeugen einer ausführbaren Datei .pdata und .xdata Abschnitte (strukturierte Ausnahmebehandlungstools). Überprüfen Sie auch Raw Pseudo Operations . Anscheinend wenn Sie Ihren Code während eines SEH-Abwicklungsvorgangs im Stapel haben, wird erwartet, dass Sie diese verwenden.
Ich fand etwas mehr Informationen unter Ссылка . Dieser Thread scheint das ursprüngliche Einchecken in gas
zu sein, um Unterstützung für alle .set_ * Pseudo-Ops hinzuzufügen.
Ich möchte den Patch für .pdata und .xdata Generation von zeigen Pe-Coff Ziele durch Gas und um etwas Feedback zu erhalten. Dieser Patch Beinhaltet Unterstützung für Arm, ppc, Arm, sh (3 & 4), Mips und x64. Wie für x86 gibt es keine OS-Unterstützung für Laufzeitfunktion Informationen, die ich verschont habe dieser Teil. Es würde nur die ausführbare Größe für x86 PE und dort erhöhen ist kein wirklicher Gewinn für dieses Ziel.
Kurzer Überblick:
Momentan sind drei verschiedene Funktionseingabeformate voreingestellt.Der erste ist der MIPS. Die zweite Version ist für ARM, PPC, SH3, und SH4 hauptsächlich für Windows CE. Die dritte ist die IA64 und X64-Version. Beachten Sie, dass die IA64 noch nicht implementiert ist, aber um Informationen darüber zu finden es, siehe die Spezifikation über IA64 auf Ссылка Datei.
Die erste Version enthält nur Einträge im pdata-Abschnitt: BeginAddress, EndAddress, ExceptionHandler, HandlerData und PrologueEndAddress. Jeder Wert ist ein Zeiger auf die entsprechenden Daten und hat eine Größe von 4 Bytes.
Die zweite Variante enthält folgende Einträge im pdata-Abschnitt. BeginAddress, PrologueLength (8 Bit), EndAddress (22 Bit), Use-32-Bit-Befehl (1 Bit) und Exception-Handler-Exists (1 Bit). Wenn die FunktionLength Null ist, oder das Exception-Handler-Exists-Bit ist true, ein DATA_EH-Block wird direkt vor der Funktionseingabe platziert.
Die dritte Version hat einen Funktionsbaustein von BeginAddress (RVA), EndAddress (RVA) und UnwindData (RVA). Die Beschreibung des Prolog, Exception-Handler und zusätzliche SEH-Daten werden darin gespeichert das Feld UNWIND_DATA im Abschnitt xdata.
.seh_proc & lt; fct_name & gt;
Dies gibt an, dass ein SEH-Block für die Funktion & lt; fct_name & gt; beginnt. Dies gilt für alle Ziele..seh_endprologue
Durch diese Pseudo-Adresse wird die Position der Prolog-Endadresse (durch die aktuelle Code-Adresse des Auftretens von diese Pseudo). Gültig für alle Ziele..seh_handler & lt; Handler & gt; [, & lt; Handler-Daten & gt;]
Dieser Pseudo gibt die zu verwendende Handler-Funktion an. Für Version 2 der handler-data-Feld gibt den optionalen Benutzerdatenblock an. Für Version 3 das handler-data-Feld kann ein rva zu user-data (für FHANDLER) sein, wenn Der Name ist @unwind der UHANDLER Abwickelblock wird generiert, und wenn es geht ist @except (oder überhaupt nicht angegeben) EHANDLER Exception Block ist generiert..seh_eh
Dieser Pseudo wird für Version 2 verwendet, um die Position der Funktion begin in assembly anzugeben. Hier sind die PDATA_EH Daten kann gespeichert werden..seh_32 / .seh_no32
Diese Pseudos werden nur für Version 2 verwendet (siehe oben für Beschreibung). Momentan ist es no32, wenn nicht angegeben..seh_endproc
Durch dieses Pseudo wird das Ende des SEH-Blocks angegeben..seh_setframe & lt; reg & gt;, & lt; offset & gt;
Durch dieses Pseudo das Frame-Register und der Offset (Wert zwischen 0-240 mit 16-Byte Ausrichtung) kann angegeben werden. Dies wird nur von Version 3 verwendet..seh_stackalloc & lt; size & gt;
Durch diese Stack-Zuweisung in Code wird für Version 3 beschrieben..seh_pushreg Dadurch wird ein allgemeiner Register-Push-In-Code für die Version 3 beschrieben.
.seh_savereg & lt; reg & gt;
Dadurch wird für die Version 3 ein allgemeines Speicherspeichern im Code beschrieben..seh_savemm & lt; mm & gt;
Dadurch wird für die Version 3 ein mm-Register beschrieben, das im Code gespeichert wird..seh_savexmm
Dadurch wird ein für Speicher in Code gespeichertes xmm-Register für Version 3 beschrieben..seh_pushframe
Durch diese Informationen über die Art des Eintrags kann für Version 3 beschrieben werden..seh_scope & lt; beginnen & gt;, & lt; Ende & gt;, & lt; Handler & gt;, & lt; springen & gt;
Damit können SCOPED-Einträge für Abwicklungen oder Ausnahmen angegeben werden Version 3.Dies gilt nur für UHANDLE und EHANDLER xdata Deskriptor und ein globaler Handler muss angegeben werden. Für Handler und Sprungargumente, Namen von @ 1, @ 0 und @null können verwendet werden und sie sind Spezifizieren, dass eine Konstante anstelle eines rva verwendet werden muss.
Es gibt auch eine Diskussion über .xdata und .pdata (zusammen mit einer Reihe von Links) unter Ссылка .