下面粘贴的是"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)
它以一个长度开始,根据LSCIE1
和LECIE1
标签的差异计算:
.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)
这些异常处理表大多是无趣的,但如果你想知道,那么这里有关于格式的信息.