2010-05-24 14 views
5

Unten eingefügt ist nicht optimierten GCC assembly output für "int main() {}". Ich bin relativ gut mit x86-Assembly, aber etwas davon ist nicht vertraut. Könnte jemand bitte eine Zeile für Zeile durchgehen, was hier vor sich geht?x86 gcc assembly output hilfe bitte

Danke!

.text 
.globl _main 
_main: 
LFB2: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    leave 
    ret 
LFE2: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 
EH_frame1: 
    .set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 
LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 
.globl _main.eh 
_main.eh: 
LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 
LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB2-. 
    .set L$set$2,LFE2-LFB2 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB2 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

Antwort

11

Sagen Sie der Linker diese setzen in die .text Abschnitt der ausführbaren Datei:

.text 

Export main als externes Symbol:

.globl _main 

Definieren Sie die main Funktion selbst:

_main: 
LFB2: 

Speichere den vorherigen Rahmenzeiger:

pushq %rbp 
LCFI0: 

einen neuen Rahmenzeiger ein:

movq %rsp, %rbp 
LCFI1: 

den alten Rahmenzeiger wiederherstellen und Anrufer zurück:

leave 
    ret 

Die folgenden Richtlinien ein .eh_frame Abschnitt einrichten, Informationen enthalten, wird von der C++ - Laufzeit für die Ausnahmebehandlung benötigt.

LFE2: 
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support 

Dies ist die Tabelle Common Information Eintrag ist:

EH_frame1: 

Es beginnt mit einer Länge, aus der Differenz der LSCIE1 und LECIE1 Etiketten berechnet:

.set L$set$0,LECIE1-LSCIE1 
    .long L$set$0 

(Die .long, .byte, .ascii und .quad bewirken, dass ein Wert des entsprechenden Typs direkt von th ausgegeben wird der Assembler). Dann folgt die CIE Tabelle selbst:

LSCIE1: 
    .long 0x0 
    .byte 0x1 
    .ascii "zR\0" 
    .byte 0x1 
    .byte 0x78 
    .byte 0x10 
    .byte 0x1 
    .byte 0x10 
    .byte 0xc 
    .byte 0x7 
    .byte 0x8 
    .byte 0x90 
    .byte 0x1 
    .align 3 
LECIE1: 

Ein weiteres externes Symbol, dies für die Rahmen Beschreibung Eintrag der main Funktion (noch Teil der Ausnahmebehandlung Informationen):

.globl _main.eh 
_main.eh: 

Wieder beginnt der FDE mit eine Länge:

LSFDE1: 
    .set L$set$1,LEFDE1-LASFDE1 
    .long L$set$1 

..und fährt mit dem Rest der FDE-Tabelle fort.

LASFDE1: 
    .long LASFDE1-EH_frame1 
    .quad LFB2-. 
    .set L$set$2,LFE2-LFB2 
    .quad L$set$2 
    .byte 0x0 
    .byte 0x4 
    .set L$set$3,LCFI0-LFB2 
    .long L$set$3 
    .byte 0xe 
    .byte 0x10 
    .byte 0x86 
    .byte 0x2 
    .byte 0x4 
    .set L$set$4,LCFI1-LCFI0 
    .long L$set$4 
    .byte 0xd 
    .byte 0x6 
    .align 3 
LEFDE1: 
    .subsections_via_symbols 

Diese Ausnahmebehandlung Tabellen sind meist uninteressant, aber wenn man dann Informationen über das Format wissen wollen, ist available here.

+0

Seltsam, dass es C++ - Funktionen gibt. Ich produzierte die Ausgabe mit gcc. – kelf

1

gibt es nur wenige Zeilen Assemblersprache. Andere sind Definitionen (alle, die mit Punkt (.) beginnen) die meisten von ihnen sind Speicherzuweisungen, andere können Sie leicht in GCC-Dokumenten finden.

LFB2: 
    pushq %rbp 
LCFI0: 
    movq %rsp, %rbp 
LCFI1: 
    leave 
    ret 

Dies ist Eingabe/Verlassen Stapelrahmen.