首页 > 编程语言 >C----函数递归之反汇编

C----函数递归之反汇编

时间:2024-09-18 20:35:41浏览次数:9  
标签:00 递归 int sum ---- push ebp 反汇编 fun

环境

win10
vc6.0
debug

代码

关于求阶层问题:n!=n(n-1)!;(n-1)! = (n-1)(n-2)!
例如5!=5(4)! 4!=43! 3!=32! 2!=21 函数递归的出口是1,所以函数递归最重要的条件是去寻找递归的出口

int fun(int i)
{
  int sum = 0;
  if (i == 1)
  {
    return 1;
  }
  else
  {
    sum = i*fun(i-1);
  }
  return sum ;
}
int main()
{	
  int  n = 0;
  printf("请输入你要求的阶层\r\n");
  scanf("%d",&n);
  int result1 = fun(n);
  printf("%d",result1);
  return 0;
}

关于调试去栈的问题

1.main栈

2.fun(0x00000005)栈 i=5;sum = 0

3.fun(0x00000004)栈 i=4;sum = 0

4.fun(0x00000003)栈 i=3;sum = 0

5.fun(0x00000002)栈 i=2;sum = 0

6.fun(0x00000001)栈 i=1;sum = 0

7.当 i = 1,sum=0时 走完if(i==1)时会走return 1 return之后直接走到fun的右括号,黄色箭头代表即将执行但还未执行的代码.

8.清理函数fun(0x00000001)栈空间并进入fun(0x00000002)的栈

9.执行完以后
sum=2;

10.清理函数fun(0x00000003)的栈
i=3 * fun(3-1) ==6 sum =6;

以此直到fun(0x00000005)的栈清理完为止

函数递归执行图

汇编代码分析

21:   int main()
22:   {
0040D790 55                   push        ebp
0040D791 8B EC                mov         ebp,esp
0040D793 83 EC 48             sub         esp,48h
0040D796 53                   push        ebx
0040D797 56                   push        esi
0040D798 57                   push        edi
0040D799 8D 7D B8             lea         edi,[ebp-48h]
0040D79C B9 12 00 00 00       mov         ecx,12h
0040D7A1 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
0040D7A6 F3 AB                rep stos    dword ptr [edi]
23:     int  n = 0;
0040D7A8 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0 //[ebp-4]第一个局部变量 [ebp-8]就是代表第2个局部变量;[ebp-C]就是代表第3个局部变量以此类推
24:     printf("请输入你要求的阶层\r\n");
0040D7AF 68 A4 2F 42 00       push        offset string "\xc7\xeb\xca\xe4\xc8\xeb\xc4\xe3\xcf\xeb\xd2\xaa\xc7\xf3\xb5\xc4" (00422f
0040D7B4 E8 87 39 FF FF       call        printf (00401140)
0040D7B9 83 C4 04             add         esp,4
25:     scanf("%d",&n);
0040D7BC 8D 45 FC             lea         eax,[ebp-4]
0040D7BF 50                   push        eax
0040D7C0 68 1C 20 42 00       push        offset string "%d" (0042201c)
0040D7C5 E8 16 22 00 00       call        scanf (0040f9e0)
0040D7CA 83 C4 08             add         esp,8
26:     int result1 = fun(n);
0040D7CD 8B 4D FC             mov         ecx,dword ptr [ebp-4]
0040D7D0 51                   push        ecx
0040D7D1 E8 43 38 FF FF       call        @ILT+20(fun) (00401019)
0040D7D6 83 C4 04             add         esp,4
0040D7D9 89 45 F8             mov         dword ptr [ebp-8],eax
27:     printf("%d",result1);
0040D7DC 8B 55 F8             mov         edx,dword ptr [ebp-8]
0040D7DF 52                   push        edx
0040D7E0 68 1C 20 42 00       push        offset string "%d" (0042201c)
0040D7E5 E8 56 39 FF FF       call        printf (00401140)
0040D7EA 83 C4 08             add         esp,8
28:     return 0;
0040D7ED 33 C0                xor         eax,eax
29:   }

标签:00,递归,int,sum,----,push,ebp,反汇编,fun
From: https://www.cnblogs.com/doubleconquer/p/18417018

相关文章

  • 分类
    与输出连续数值的回归模型不同,分类模型的输出是类别(category)。常见分类做法是通过设定阈值(threshold),若逻辑回归的输出大于(或等于,取决于实现方式)阈值时判定为正例,否则为反例。根据输出标签的种数又可以将分类模型划分为二元分类(BinaryClassification)与多分类。分类输出结果不一定......
  • 移动语义
    在C++中,"移动版本"是指使用了移动构造函数或移动赋值运算符的对象构造过程。这种过程可以显著减少资源的复制开销。移动语义简介移动语义允许将资源(如动态分配的内存)从一个对象转移到另一个对象,而不是复制这些资源。它通过以下方式实现:移动构造函数:用于创建一个新对象,并将......
  • P2668
    d_f_s附赠双倍经验,好耶!然后爆搜就行#include<bits/stdc++.h>usingnamespacestd;intT,n,ans,sum[25];voiddfs(intx)//x为出牌次数{ if(x>=ans)return; //顺子 intk=0;//单顺子 for(inti=3;i<=14;i++)//注意2和大小王不能考虑 { if(sum[i]==0)k=0;//顺子......
  • 9.12
    一.多选题(共8题,66.4分)1. (多选题)从软件工程方面,软件可以划分为:A.系统软件B.支撑软件C.应用软件D.单机软件我的答案: ABC:系统软件;支撑软件;应用软件; 2. (多选题)从服务对象方面,软件可以划分为:A.网络软件B.单机软件C.产品软件D.项目软件......
  • 9.16
    今天完成《机器学习》的第一次作业,找到了网上的大量的数据集,并且下载,试图理解。数据集名称Iris来源UCIMachineLearningRepository[下载地址: https://archive.ics.uci.edu/ml/datasets/Iris]数据集描述 Iris数据集是一个常用的多类别分类问题数据......
  • Day12.异常
    异常什么是异常异常指程序运行过程中出现的不期而至的各种状况,Exception异常发生在程序运行期间,它影响了正常的程序执行流程简单分类检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的,这些异常在编译时不能被简单地忽略运行时异常:运行时异常......
  • ICPC2021 沈阳站 M String Problem 题解 | 十种做法一网打尽 , 一道题带你回顾字符串科
    题目传送门题意给定一个字符串,求每个前缀的字典最大序子串。注意到:对于每个前缀$s_{[1,i]}$,字典序最大子串的右边界一定是\(i\)。随着着\(i\)的增大,字典序最大子串的左边界一定是单调不减的。解法不分先后。后缀数组SASA&SAM后缀数组&后缀自动机SA对所有......
  • Comsol仿真二维光子晶体的能带和全场仿真
    文章来源:Diracconesinducedbyaccidentaldegeneracyinphotoniccrystalsandzero-refractive-indexmaterials。零折射率材料是一类具有特殊电磁特性的介质,其特点是在特定频率下,材料的有效折射率为零。这种材料的物理特性表现为对电磁波的传播不产生任何相位延迟,即使电......
  • 9.17
    今天是中秋节,祝大家中秋节快乐。今天发《机器学习》作业二,明天是个特殊的日子,不发博客。 一.单选题(共2题,40分)1. (单选题) 在评价模型的性能时,一般是更希望算法模型的(C) A 训练误差小 B 测试误差小 C 泛化误差小 D 以上都是 2.......
  • springboot+vue疫情监控系统【开题+程序+论文】
    系统程序文件列表开题报告内容研究背景近年来,全球范围内频繁爆发的疫情不仅严重威胁着人类生命健康,也对社会经济活动造成了巨大冲击。随着信息技术的飞速发展,构建高效、智能的疫情监控系统成为应对疫情挑战、保障公共卫生安全的重要手段。该系统旨在通过集成多源数据、运用......