用FPU的单元保存返回值的一个小例子

发布于 2022-09-18 21:40:17 字数 1909 浏览 12 评论 0

在一些计算的函数里,作为常规,编译器形成的代码可以用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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

轮廓§ 2022-09-25 21:40:17

用FPU的单元做返回值,通用性和移植性差一些!

黑白记忆 2022-09-25 21:40:17

可移植性?编译器用这种方法挺好 又不用程序员思考这个可移植性的问题

软的没边 2022-09-25 21:40:17

原帖由 newIT666 于 2008-5-18 19:32 发表
用FPU的单元做返回值,通用性和移植性差一些!

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

只等公子 2022-09-25 21:40:17

原帖由 hzcgz 于 2008-5-19 14:02 发表

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

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

晨曦慕雪 2022-09-25 21:40:17

原帖由 prolj 于 2008-5-18 19:48 发表
可移植性?编译器用这种方法挺好 又不用程序员思考这个可移植性的问题

支持,是否用FPU是由编译器决定的.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文