- 论坛徽章:
- 0
|
在一些计算的函数里,作为常规,编译器形成的代码可以用eax 等cpu寄存器作为返回值
对于INTEL CPU 的操作系统,在进行进程切换的时,对FPU的状态也进行了保存和恢复(挂起时用FSAVE指令保存,再运行时用FRSTOR恢复)
因此,一些编译器也用FPU的单元保存返回值:
求double和c function
- double sum_double(int double_count,double* double_list)
- {
- int i;
- double local_sum = 0.0;
- for(i=0;i<count;i++)
- local_sum+=double_list[i];
- return(local_sum);
- }
- ...
- double_rtn=sum_double(...);
- ...
复制代码
编译器可替换成的代码:
- ;finit 在适当的地方运行
- push esi
- fldz ;FPU st[0] 置零
- mov ecx,[esp+8] ;double_count
- mov esi,[esp+12] ;double_list
- sum_loop:
- jecxz exit ;if(ecx==0) 则退出
- fadd QWORD PTR[esi] ;求和,结果放在FPU st[0]
- dec ecx ;double_count--
- add esi,8 ;i++
- jmp sum_loop ;continue
- exit
- pop esi
- ret ;用FPU st[0]存结果,传递返回值
- ...
- fstp double_rtn ;返回值double_rtn=st[0]
- ...
复制代码
[ 本帖最后由 system888net 于 2008-5-18 16:19 编辑 ] |
评分
-
查看全部评分
|