2010-05-24 15 views
5

Pegado a continuación es la salida del ensamblaje GCC no optimizado para "int main() {}". Soy relativamente bueno con el ensamblaje x86, pero algo de esto no me resulta familiar. ¿Podría alguien hacer un recorrido línea por línea de lo que está pasando aquí?x86 gcc assembly output help please

Gracias!

.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 

Respuesta

11

Dile al enlazador para poner esto en .text sección del ejecutable:

.text 

exportación main como un símbolo externo:

.globl _main 

definir la función main sí:

_main: 
LFB2: 

Guarde el puntero de marco anterior:

pushq %rbp 
LCFI0: 

Configurar un nuevo puntero de marco:

movq %rsp, %rbp 
LCFI1: 

Restaurar el puntero de marco antiguo y volver a la persona que llama:

leave 
    ret 

Las siguientes directivas son la creación de una sección .eh_frame, que contiene información requerido por el tiempo de ejecución de C++ para el manejo de excepciones.

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

Ésta es la tabla de entrada de información común:

EH_frame1: 

Se inicia con una longitud, calculada a partir de la diferencia de las etiquetas LSCIE1 y LECIE1:

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

(El .long, .byte, .ascii y .quad hacen que un valor del tipo apropiado sea emitido directamente por e ensamblador). Luego sigue la tabla misma CIE:

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: 

Otro símbolo externo, éste para la función main marco de descripción de entrada (siendo parte de la información de manejo de excepciones):

.globl _main.eh 
_main.eh: 

Una vez más, el FDE comienza con una longitud:

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

..y continúa con el resto de la tabla 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 

Esas tablas de manejo de excepciones son en su mayoría sin interés, pero si quieres conocer a continuación información sobre el formato es available here.

+0

Es extraño que haya funciones C++ allí. Produje la salida con gcc. – kelf

1

hay algunas líneas del lenguaje ensamblador. otras son definiciones (todas comienzan con punto (.)) la mayoría de ellas son asignaciones de memoria, otras pueden encontrarse fácilmente en documentos gcc.

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

esto es entrar/salir del marco de la pila.