|
|
发表于 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] |
|