免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2714 | 回复: 5
打印 上一主题 下一主题

用FPU的单元保存返回值的一个小例子 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-28 18:16 |只看该作者 |倒序浏览
在一些计算的函数里,作为常规,编译器形成的代码可以用eax 等cpu寄存器作为返回值
对于INTEL CPU 的操作系统,在进行进程切换的时,对FPU的状态也进行了保存和恢复(挂起时用FSAVE指令保存,再运行时用FRSTOR恢复)
因此,一些编译器也用FPU的单元保存返回值:

求double和c function

  1. double sum_double(int double_count,double* double_list)
  2. {
  3.     int i;
  4.     double local_sum = 0.0;
  5.     for(i=0;i<count;i++)
  6.         local_sum+=double_list[i];
  7.     return(local_sum);
  8. }

  9. ...
  10. double_rtn=sum_double(...);
  11. ...
复制代码

编译器可替换成的代码:

  1.   ;finit 在适当的地方运行
  2.   push esi  
  3.   fldz                 ;FPU st[0] 置零
  4.   mov ecx,[esp+8]     ;double_count
  5.   mov esi,[esp+12]    ;double_list
  6. sum_loop:
  7.   jecxz exit           ;if(ecx==0) 则退出
  8.   fadd QWORD PTR[esi]  ;求和,结果放在FPU st[0]
  9.   dec ecx              ;double_count--
  10.   add esi,8            ;i++
  11.   jmp sum_loop         ;continue
  12.   exit
  13.   pop esi
  14. ret                    ;用FPU st[0]存结果,传递返回值

  15. ...
  16. fstp double_rtn          ;返回值double_rtn=st[0]
  17. ...
复制代码

[ 本帖最后由 system888net 于 2008-5-18 16:19 编辑 ]

评分

参与人数 1可用积分 +3 收起 理由
prolj + 3 好方法

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-05-18 19:32 |只看该作者
用FPU的单元做返回值,通用性和移植性差一些!

论坛徽章:
0
3 [报告]
发表于 2008-05-18 19:48 |只看该作者
可移植性?编译器用这种方法挺好 又不用程序员思考这个可移植性的问题

论坛徽章:
0
4 [报告]
发表于 2008-05-19 14:02 |只看该作者
原帖由 newIT666 于 2008-5-18 19:32 发表
用FPU的单元做返回值,通用性和移植性差一些!


编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.

论坛徽章:
0
5 [报告]
发表于 2008-05-22 14:29 |只看该作者
原帖由 hzcgz 于 2008-5-19 14:02 发表


编译后如果在没有FPU的机器上则没法运行了,但每个机器都有CPU,因此用CPU更通用.


从奔腾开始 intel 和 amd 的那个CPU里没含有FPU?
FPU已经是CPU的一部分了。

论坛徽章:
0
6 [报告]
发表于 2008-05-22 14:31 |只看该作者
原帖由 prolj 于 2008-5-18 19:48 发表
可移植性?编译器用这种方法挺好 又不用程序员思考这个可移植性的问题


支持,是否用FPU是由编译器决定的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP