x86 gcc汇编输出请帮忙

kel*_*elf 5 c assembly gcc

下面粘贴的是"int main(){}"的未经优化的GCC程序集输出.我对x86程序集比较好,但其中一些是不熟悉的.有人可以一行一步地了解这里发生的事情吗?

谢谢!

    .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
Run Code Online (Sandbox Code Playgroud)

caf*_*caf 11

告诉链接器将其放入可执行文件的.text部分:

    .text
Run Code Online (Sandbox Code Playgroud)

导出main为外部符号:

.globl _main
Run Code Online (Sandbox Code Playgroud)

定义main函数本身:

_main:
LFB2:
Run Code Online (Sandbox Code Playgroud)

保存上一帧指针:

    pushq   %rbp
LCFI0:
Run Code Online (Sandbox Code Playgroud)

设置一个新的帧指针:

    movq    %rsp, %rbp
LCFI1:
Run Code Online (Sandbox Code Playgroud)

恢复旧框架指针并返回调用者:

    leave
    ret
Run Code Online (Sandbox Code Playgroud)

以下指令正在设置一个.eh_frame部分,其中包含C++运行时所需的异常处理信息.

LFE2:
    .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
Run Code Online (Sandbox Code Playgroud)

这是公共信息条目表:

EH_frame1:
Run Code Online (Sandbox Code Playgroud)

它以一个长度开始,根据LSCIE1LECIE1标签的差异计算:

    .set L$set$0,LECIE1-LSCIE1
    .long L$set$0
Run Code Online (Sandbox Code Playgroud)

(该.long,.byte,.ascii.quad使适当的类型的值,以由汇编器被直接发射).然后遵循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:
Run Code Online (Sandbox Code Playgroud)

另一个外部符号,这个符号用于main函数的Frame Description Entry(仍然是异常处理信息的一部分):

.globl _main.eh
_main.eh:
Run Code Online (Sandbox Code Playgroud)

同样,FDE以一个长度开始:

LSFDE1:
    .set L$set$1,LEFDE1-LASFDE1
    .long L$set$1
Run Code Online (Sandbox Code Playgroud)

..继续使用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
Run Code Online (Sandbox Code Playgroud)

这些异常处理表大多是无趣的,但如果你想知道,那么这里有关于格式的信息.