Was sind .seh_ * Assembly-Befehle, die gcc ausgibt?

8

Ich benutze gcc -S für ein Hallo-Welt-Programm. Was sind die 5 .seh_ Befehle? Ich kann nicht viel Informationen über sie finden, wenn ich suche.

%Vor%     
Josh 28.12.2013, 22:12
quelle

3 Antworten

5

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 Ссылка .

    
David Wohlferd 04.07.2016 10:00
quelle
4

Ich habe sie mit der Ausgabe gestoppt:

%Vor%

damit ich das nachsehen kann. Aber ich bin froh, dass ich sie nicht mehr ausgeben lasse.

    
Josh 28.12.2013 22:55
quelle
2

Sie scheinen mit der Ausnahmebehandlung zu tun zu haben. Das ist alles was ich finden konnte.

Ссылка

    
James 28.12.2013 22:21
quelle

Tags und Links