LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: 杨珂

谁来说说 “-fomit-frame-pointer” 对编译系统的影响

[复制链接]
发表于 2006-9-8 22:14:03 | 显示全部楼层
gcc man上似乎是说某些函数不需要祯指针%ebp的时候,就不保留%ebp,这样还可以多一个寄存器使用,不知道哪些函数不需要%ebp?是没有参数的函数么?这样的函数在C语言里似乎不会很多吧?谁解释一下。
回复 支持 反对

使用道具 举报

发表于 2006-9-8 22:39:13 | 显示全部楼层
应该是任何函数都可以
有参数并且有本地变量的函数也可以省略frame pointer
因为那种情况下参数和本地变量的访问都是借助于esp来进行的,而不是ebp
据我的观察,情况是这样的
进入函数后先把esp减去一个数,该值是所有的本地变量和被本函数所调用的有最多参数的函数的参数所占据空间的和
本地变量和本函数参数以及本函数所调用的函数的参数地址都是在esp上加一个数值来获得

另外可以对比一下有没有frame pointer的差别,没有fp的话,生成的代码量会减少,减少的量和函数调用次数相关
要执行的代码减少,和可执行文件本身体积的减少,都可以提高程序执行速度
[PHP]
$ diff -u test.s with-frame-pointer.s
--- test.s      2006-09-08 22:33:42.000000000 +0800
+++ with-frame-pointer.s        2006-09-08 22:32:56.000000000 +0800
@@ -6,19 +6,21 @@
.globl func
        .type   func, @function
func:
+       pushl   %ebp
+       movl    %esp, %ebp
        subl    $16, %esp
-       movl    $1, 8(%esp)
-       movl    $3, 12(%esp)
-       movl    20(%esp), %eax
+       movl    $1, -8(%ebp)
+       movl    $3, -4(%ebp)
+       movl    8(%ebp), %eax
        movl    %eax, (%esp)
        call    puts
-       movl    12(%esp), %eax
+       movl    -4(%ebp), %eax
        movl    %eax, 4(%esp)
        movl    $.LC0, (%esp)
        call    printf
-       movl    12(%esp), %eax
-       addl    8(%esp), %eax
-       addl    $16, %esp
+       movl    -4(%ebp), %eax
+       addl    -8(%ebp), %eax
+       leave
        ret
        .size   func, .-func
        .section        .rodata
@@ -28,10 +30,12 @@
.globl main
        .type   main, @function
main:
+       pushl   %ebp
+       movl    %esp, %ebp
        subl    $4, %esp
        movl    $.LC1, (%esp)
        call    func
-       addl    $4, %esp
+       leave
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.1 (Gentoo 4.1.1-r1)"
[/PHP]
回复 支持 反对

使用道具 举报

发表于 2006-9-9 20:28:06 | 显示全部楼层
thanks,看来汇编还是要好好看看滴
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表