Java教程

裴波那契数列的反汇编分析

本文主要是介绍裴波那契数列的反汇编分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

首先是用函数递归的方式去分析斐波那契数列

/*
源代码
*/
#include "stdio.h"
int FunctionRecursion(int n) //函数的递归,增加内存开销.因为会一直调用函数直到函数返回
{
	if (n == 1 || n == 0)
	{
		return n;
	}
	else   //f(n) = f(n-1)+f(n-2);n == 1 || n==0
	{
		return FunctionRecursion(n-1)+ FunctionRecursion(n-2);
	}
}

int
main(void)
{
	printf("%d",FunctionRecursion(10)) ;
	return 0;
}

首先看mian函数

00CA1500 |  | push ebp                                           | 4_5.Function_Recursion.c:17
00CA1501 |  | mov ebp,esp                                        |
00CA1503 |  | push A                                             | 4_5.Function_Recursion.c:18
00CA1505 |  | call 4_5.function_recursion.c.CA1041               | Function_Recursion 记住地址0x00CA1041
00CA150A |  | add esp,4                                          |
00CA150D |  | push eax                                           | functionrecursion返回值
00CA150E |  | push 4_5.function_recursion.c.CAA000               | 格式化 符号 %d
00CA1513 |  | call 4_5.function_recursion.c.CA1082               | printf函数
00CA1518 |  | add esp,8                                          |
00CA151B |  | xor eax,eax                                        | 4_5.Function_Recursion.c:19
00CA151D |  | cmp ebp,esp                                        | 4_5.Function_Recursion.c:20
00CA151F |  | call 4_5.function_recursion.c.CA115E               | CheckEsp函数

然后呢进入到0xCA1041 这个函数里面去观察FunctionRecursion到底是怎么执行的

00CA14B0 |  | push ebp                                           | 4_5.Function_Recursion.c:3
00CA14B1 |  | mov ebp,esp                                        |
00CA14B3 |  | push esi                                           |
00CA14B4 |  | cmp dword ptr ss:[ebp+8],1                         | 4_5.Function_Recursion.c:4
00CA14B8 |  | je 4_5.function_recursion.c.CA14C0                 | 判断参数1是否是1 如果等于就跳转 不等于则判断是否等于0
00CA14BA |  | cmp dword ptr ss:[ebp+8],0                         |
00CA14BE |  | jne 4_5.function_recursion.c.CA14C7                | 判断参数1是否等于0 如果不等就跳转,等于就不跳,
00CA14C0 |  | mov eax,dword ptr ss:[ebp+8]                       | 以上的两个逻辑其实就是if语句
00CA14C3 |  | jmp 4_5.function_recursion.c.CA14E9                | 跳转至函数尾部
00CA14C5 |  | jmp 4_5.function_recursion.c.CA14E9                | 跳转至函数尾部
00CA14C7 |  | mov eax,dword ptr ss:[ebp+8]                       | 将我们传入的参数初始是10
00CA14CA |  | sub eax,1                                          |
00CA14CD |  | push eax                                           |
00CA14CE |  | call 4_5.function_recursion.c.CA1041               | 将10减去1之后调用函数本身,函数本身返回的数值 赋值给eax
00CA14D3 |  | add esp,4                                          |
00CA14D6 |  | mov esi,eax                                        | 返回值给到eax
00CA14D8 |  | mov ecx,dword ptr ss:[ebp+8]                       |
00CA14DB |  | sub ecx,2                                          |
00CA14DE |  | push ecx                                           |
00CA14DF |  | call 4_5.function_recursion.c.CA1041               | 将10减去2之后调用函数本身,函数本身返回的数值 赋值给eax
00CA14E4 |  | add esp,4                                          |
00CA14E7 |  | add eax,esi                                        | 返回值1加上返回值2就等于我们的数值了
00CA14E9 |  | pop esi                                            | 4_5.Function_Recursion.c:13
00CA14EA |  | cmp ebp,esp                                        |
00CA14EC |  | call 4_5.function_recursion.c.CA115E               |
00CA14F1 |  | pop ebp                                            |
00CA14F2 |  | ret                                                |

那么我们现在看到的是FunctionRecursion函数的原形.
我们假定传入10.那么程序会先判断这个值是否是1或者是0
如果不是
将10-1然后 再去调用函数本身, 那么函数本身就会来9 - 1 同理再调用函数本身 一直到函数传入的参数是1或者是0
然后函数本身再回去执行10-2 9-2 8-2…等等的函数
这就是函数的递归
函数的递归其实对内存的开销比较打,这里一般就用循环语句来表示
源代码

#include "stdio.h"
int iFibonaccisequence(int n)//斐波那契数列
{
	int iResult = 1 ; //用于返回
	int last = 0;   //用于记录iResult上一个值
	for (int i = 0; i <n-1; ++i)
	{
		int tmp = iResult;
		iResult = iResult+ last;
		printf("%d\n",iResult);
		last =tmp;
	}
	/* 我的理解
	 * 根据公式已知的结果推导公式再输出结果
	 * 而函数递归是根据公式推导结果再输出结果
	 * */
	return  iResult;
}
int main(void)
{
	printf("%d",iFibonaccisequence(10)) ;
	return  0;
}

由于时间关系,分析我汇编的部分就不去写了.

这篇关于裴波那契数列的反汇编分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!