bluebird1999
驱动牛犊
驱动牛犊
  • 注册日期2002-06-19
  • 最后登录2002-08-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:941回复:2

一个费解的问题!

楼主#
更多 发布于:2002-08-05 12:53
我用c++和fortran混合编程,发现同一个函数,有时fortran要快的多,
我后来发觉是C++编译器在被调用函数的开头且处理完ESP,EBP侯家了这么一段:
***********************************************************
137:  void Deriv_OI(double dX[6],double dF[],CClstOITab* cTab)
138:  {
004017D0 55                   push        ebp
004017D1 8B EC                mov         ebp,esp
004017D3 B8 FC DB 00 00       mov         eax,0DBFCh
004017D8 E8 53 CB 00 00       call        $$$00001 (0040e330)
004017DD 53                   push        ebx
004017DE 56                   push        esi
004017DF 57                   push        edi
004017E0 8D BD 04 24 FF FF    lea         edi,[ebp-0DBFCh]
004017E6 B9 FF 36 00 00       mov         ecx,36FFh
004017EB B8 CC CC CC CC       mov         eax,0CCCCCCCCh
004017F0 F3 AB                rep stos    dword ptr [edi]
 
***********************************************************
从斜体部分(004017E0)开始,可以看出,这是一个很大的循环,而对比fortran代码,就没有这个操作,
***********************************************************
3:    SUBROUTINE DERIV2_OI[C](T,X,F,PV)
0045C630 55                   push        ebp
0045C631 8B EC                mov         ebp,esp
0045C633 83 EC 4C             sub         esp,4Ch
0045C636 53                   push        ebx
0045C637 56                   push        esi
0045C638 57                   push        edi
***********************************************************
而且每个c++函数都有这个,我觉得是对堆栈的其余部分进行某种操作
到底是在干什么呢?为什么这么做?另外那个call  $$$00001又是做什么?好象是pageprobe什么的.
希望那个老大能给解答!
xdjm
驱动中牛
驱动中牛
  • 注册日期2001-04-02
  • 最后登录2024-01-25
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望25点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-08-05 13:10
这是DEBUG版本吧!编译器产生这些代码可以方便调试,你可以看一下,在DEBUG版本下,所有未赋值的局部变量的初始值都是0CCCCCCCC,但是RELEASE版本就没有这些代码了,因为它已经做了优化。
bluebird1999
驱动牛犊
驱动牛犊
  • 注册日期2002-06-19
  • 最后登录2002-08-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-05 14:15
关键是为什么要循环赋值36FFh次?
004017E6 B9 FF 36 00 00 mov ecx,36FFh
004017EB B8 CC CC CC CC mov eax,0CCCCCCCCh
004017F0 F3 AB rep stos dword ptr [edi]
并没有那么多局部变量啊?而且这好像并不是初始化
局部变量:
004017E0 8D BD 04 24 FF FF lea edi,[ebp-0DBFCh]
而是初始化其他堆栈空间.
游客

返回顶部