我有以下c++代码
int factorial(int n){
if(n==0){
return 1;
}
return n*factorial(n-1);
}
int main(void){
factorial(5);
return 0;
}当我使用g++ -S factorial.cpp创建部件文件时,我得到以下信息:
.file "tail_call_opt.cpp"
.text
.globl _Z9factoriali
.type _Z9factoriali, @function
_Z9factoriali:
.LFB0:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
subl $24, %esp
cmpl $0, 8(%ebp)
jne .L2
movl $1, %eax
jmp .L3
.L2:
movl 8(%ebp), %eax
subl $1, %eax
movl %eax, (%esp)
call _Z9factoriali
imull 8(%ebp), %eax
.L3:
leave
ret
.cfi_endproc
.LFE0:
.size _Z9factoriali, .-_Z9factoriali
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
.cfi_personality 0x0,__gxx_personality_v0
pushl %ebp
.cfi_def_cfa_offset 8
movl %esp, %ebp
.cfi_offset 5, -8
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $5, (%esp)
call _Z9factoriali
movl $0, %eax
leave
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits我可以理解大部分内容,但是.cfi和.LFE部件的用途是什么呢?我在哪里可以了解到更多关于gcc制作的组件的信息?
发布于 2010-08-26 05:40:19
这些指令告诉gas发出Dwarf调用帧信息标记,当帧指针丢失时,这些标记显然用于重建堆栈回溯。在你的例子中,帧指针是存在的,所以我猜它可以用来在异常处理期间执行解卷。这种机制比旧的sjlj (setjump/longjump)机制具有更少的开销。请参见here,以及链接的矮人规范。
对于前缀标签,.L .Lxx表示该标签是该文件的本地标签,因此不会与其他文件中的同名标签冲突。对于自动生成的标签,GCC一般使用.L。在这种情况下,"FB“很可能表示”函数开始“,而"FE”表示“函数结束”。
https://stackoverflow.com/questions/3564752
复制相似问题