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

news/2024/9/18 20:36:58/文章来源:https://www.cnblogs.com/doubleconquer/p/18417018

环境

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:   }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/799523.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分,同时获取更精确的占…

手脱upx

其实已经是大一下刚开始的事情了,补个档 手动脱壳の新年快乐 查壳,有壳,UPXX32dbg打开文件,查看初始断点点击PUSHAD跟进,CTRL+*设置EIP,开始F8步过,寻找ESP寄存器第一次单个变红的地址此时的内存窗口开始步过第一次步过就发现ESP单个变红,右键跟进内存窗口然后在第一个…

使用firemin降低火狐内存占用

这些年一直使用火狐浏览器,之前一直在AMD平台的机器使用,没有遇到过内存占用过大的问题(可能也与平台无关)。现在在Intel CPU的机器上使用,时间一久,内存就占用很大。试过Firefox/内存消耗严重里面的办法,效果不明显。也试过修改about:config里面的一些选项,也没有达到…

代码随想录算法 - 回溯算法1

题目1 77. 组合 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n = 4, k = 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ]示例 2: 输入:n = 1, k = 1 输出:[[1]]提示:1 <= n <= 20 1 <= k…

错误

PID自己搭的时候,要注意积分模块的位置,搞不明白好久了,原来是我把积分模块的位置放错了。直接用增益模块不容易出错。

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

前言Osg需要打开模型文件,但是遇到显示动力学仿真的K模型文件,.k文件是一种描述材料属性的文件,比如密度、弹性模量等,该模型文件不是常规中间开放格式,无法直接支持,需要自定义解析并且重建三维模型。 Demo实际非常流程,因为视频转gif导致部分看起来不行:   交互流畅…

0918高数一千题,多元函数积分学

T17.第一型曲线积分空间形式 用斯托克斯公式化成第二型曲面积分 解第二型曲面积分,用高斯公式或者投影转换法,后者注意正负号,上正下负,前正后负 T18.换路径,但是x=1左半段不能化成lnx算 T19.求偏导就对对应字母求就行,不用对y导x T20.多元极值AC-B2>0A>0,极小 A<…

Dynamic Locomotion in the MIT Cheetah 3 Through Convex Model-Predictive Control

1. Swing Leg Control\(J_i \in R^{3*3}\) 是足端雅可比;\(\tau _{i,ff}\) 是前馈力矩 \(\Lambda \in R^{3*3}\)是操作空间惯性矩阵;\(a_{i,ref} \in R^{3*3}\)是机体坐标系下的参考加速度 q是关节角度;\(C_i \dot{q}_i + G_i\)是科里奥利力和重力 2. Ground Force Control …

多机训练时的环境变量

多机训练时的环境变量 通过设置环境变量配置分布式训练,仅仅是为了在交互式 Python 环境下,方便查看实验效果。如果不是学习、试验目的,而是生产需求,可以直接通过 oneflow.distributed.launch 启动分布式训练,该模块内部根据命令行参数,自动设置了必要的环境变量。 1)M…

[Java基础]Stream流

当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似。但是实际上,它们完全是不同的东西。 Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式…

学习高校课程-软件工程-软件工程(ch2)

DEFINING THE DISCIPLINE THE SOFTWARE PROCESS General Principles2.1 DEFINING THE DISCIPLINE definition for software engineering 软件工程的定义 (1) The application of a systematic, disciplined, quantifiable approach to the development, operation, and mainten…