2010-05-24 84 views
5

下面粘贴的是未优化的GCC汇编输出“int main(){}”。我对x86汇编相对来说比较好,但其中一些并不熟悉。是否有人可以对这里发生的事情做一个逐行的介绍?x86 gcc汇编输出帮助请

谢谢!

.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 

回答

11

告诉链接把这个成可执行的.text部分:

.text 

出口main作为外部符号:

.globl _main 

定义main函数本身:

_main: 
LFB2: 

保存前一帧指针:

pushq %rbp 
LCFI0: 

设置一个新的帧指针:

movq %rsp, %rbp 
LCFI1: 

恢复旧的帧指针,并返回到调用者:

leave 
    ret 

以下指令正在建立一个.eh_frame部,包含信息C++运行时需要用于异常处理。

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

这是普通的信息输入表:

EH_frame1: 

它以一个长度从LSCIE1LECIE1标签的差计算:

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

(该.long.byte,.ascii.quad导致适当类型的值直接由第e汇编程序)。然后遵循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: 

另一个外部符号,这一个为main功能的车架说明输入(的异常处理信息还是部分):

.globl _main.eh 
_main.eh: 

再次,FDE开头长度:

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

..并继续与其余的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 

这些异常处理表大多是无趣的,但如果你想知道然后在格式信息是available here

+0

奇怪的是,那里有C++功能。我用gcc产生了输出。 – kelf 2010-05-24 04:08:02

1

有几行汇编语言。其他都是定义(所有以点(。)开头的)都是内存分配,其他你可以在gcc文档中轻松找到。

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

这是进入/退出堆栈帧。