请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

尾递归的跳转问题

jne Fib2+11h(0AA1520h)

这个地址 0AA1520h 是这样的

0AA1520h cmp ecx,1
0AA1523h je,Fib2+27h(0AA1536h)

尾递归调用的时候跳转到函数顶部,应该先判断是否等于0呀,怎么直接就判断是否等于1了?

正在回答 回答被采纳积分+3

2回答

易萧 2022-08-10 13:44:53

这个是编译器对代码逻辑进行优化了,因为第一次进函数时,这个值如果是小于等于1的,那就不会走到尾调用这一步,否则初值必大于2,此时再进行尾调用时,这个值发生递减,当这个值等于1时就已经是递归出口了,它永远都不会走到判0的时候,所以也就没有必要判断是否等于0了。

0 回复 有任何疑惑可以回复我~
quickzhao 2022-02-27 18:54:59

同学,请问问题详细描述清你问题的上下文和C++源码,不要直接放一段汇编代码,谢谢

0 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕勒8023578 #1
    函数是
    int Fib2(int n, int ret0,int ret1)
    {
    if(n == 0)
    {
       return ret0;
    }
    else if(n==1)
    {
    return ret1;
    }
    return Fib(n-1,ret1,ret0+ret1);
    }
    
    当断点进入汇编以后
    
    return Fib(n-1,ret1,ret0+ret1);
    
    最后一句生成的汇编调用是:
    
    0AA1525 lea eax,[edx+esi]
    0AA1528 mov edx,esi
    0AA152A mov esi,eax
    0AA152C sub ecx,1
    0AA152C jne Fib2+11h(0AA1520h)
    
    跳转到这个地址 0AA1520h 是这样的
    
    0AA1520h cmp ecx,1
    0AA1523h je,Fib2+27h(0AA1536h)
    
    尾递归调用的时候跳转到函数顶部,应该先判断是否等于0呀,怎么直接就判断是否等于1了?
    (视频中的汇编是这样的)
    回复 有任何疑惑可以回复我~ 2022-02-27 20:14:01
  • 提问者 weixin_慕勒8023578 #2
    看👀到问题的补充了么
    回复 有任何疑惑可以回复我~ 2022-02-28 09:19:58
  • quickzhao 回复 提问者 weixin_慕勒8023578 #3
    编译器生成的汇编有可能会优化部分不需要的代码。
    回复 有任何疑惑可以回复我~ 2022-03-02 07:59:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信