2010-05-24 12 views
5

Incollato di seguito è un output di GCC non ottimizzato per "int main() {}". Sono relativamente bravo con l'assembly x86, ma alcune di queste non sono familiari. Qualcuno potrebbe per favore fare un resoconto dettagliato di cosa sta succedendo qui?x86 Guida all'installazione dell'assieme gcc per favore

Grazie!

.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 

risposta

11

Dillo al linker di mettere questo in .text la sezione del file eseguibile:

.text 

Esportare main come simbolo esterno:

.globl _main 

definire la funzione main stesso:

_main: 
LFB2: 

Salva il precedente puntatore del frame:

pushq %rbp 
LCFI0: 

Impostare una nuova forma di cornice:

movq %rsp, %rbp 
LCFI1: 

ripristinare il vecchio forma di cornice e tornare al chiamante:

leave 
    ret 

Le seguenti direttive sono la creazione di un tratto .eh_frame, contenente le informazioni richiesto dal runtime C++ per la gestione delle eccezioni.

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

Questa è la tabella Common Information Entry:

EH_frame1: 

Si inizia con una lunghezza, determinata dalla differenza dei LSCIE1 e LECIE1 etichette:

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

(The .long, .byte, .ascii e .quad causano l'emissione diretta di un valore del tipo appropriato da parte di e assemblatore). Segue poi la tabella CIE stessa:

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: 

altro simbolo esterno, questo per della funzione main Descrizione del frame inserimento (ancora parte delle informazioni gestione delle eccezioni):

.globl _main.eh 
_main.eh: 

nuovo, il FDE inizia con una lunghezza:

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

.. e continua con il resto della tabella FDE.

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 

Tali tabelle di gestione delle eccezioni sono per lo più poco interessante, ma se volete sapere poi informazioni sul formato è available here.

+0

Strano che ci siano funzioni C++. Ho prodotto l'output con gcc. – kelf

1

ci sono poche righe di linguaggio assembly. altre sono definizioni (tutto ciò che inizia con punto (.)) la maggior parte di esse sono allocazioni di memoria, altre si possono facilmente trovare in gcc docs.

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

questo sta entrando/uscendo dal frame dello stack.

Problemi correlati