返回介绍

第 9 章 dcc - Fibo.exe

发布于 2025-03-09 23:09:35 字数 11051 浏览 0 评论 0 收藏 0

9.7.8 Fibo.exe

Fibo 是计算输入数字的斐波纳契数列的程序。斐波纳契数(Fibonacci number) 的计算用一个递归的函数执行 (两个递归被使用)。反汇编的程序见图 9-43 所示,反编译的 C 程序在图 9-44,最初的 C 程序在图 9-45。Fibo 有下列的调用图:

main

scanf

printf

exit

proc_1

proc_1

反编译的 C 程序的 main 跟最初的 C 程序有相同的指令数目;for() 循环被表示为一个 while() 循环。递归的 Fibonacci 函数,即反编译的程序中的 proc_1,使用五个指令,它们对应最初的代码中的三个指令。额外的这些指令是由于把参数复制到一个局部变量(loc1 = arg0;),以及在返回数值之前沿着两个不同的路径把结果放在一个寄存器变量中(即,有两个不同的可能结果)。在所有的方式中代码都跟最初的代码是功能等价的。注意,proc_1 的第二个递归调用上,实际参数表达式是(loc1 + -2);即等于(loc1 - 2)。前一个表达式来自该程序的反汇编——使用一个局部变量和一个负数的相加,而不是减去一个正数。从该程序的统计可知 (见图 9-46),单独的和总计的中间指令数目缩减率均是 80.77%。

 proc_1PROC NEAR   
00000035B55PUSHbp 
00100035C8BECMOVbp,sp 
00200035E56PUSHsi 
00300035F8B7604MOVsi,[bp+4] 
00400036283FE02CMPsi,2 
0050003657E1CJLEL1 
0060003678BC6MOVax,si 
00700036948DECax 
00800036A50PUSHax 
00900036BE8EDFFCALLnear ptr proc_1 
01000036E59POPcx 
01100036F50PUSHax 
0120003708BC6MOVax,si 
01300037205FEFFADDax,0FFFEh 
01400037550PUSHax 
015000376E8E2FFCALLnear ptr proc_1 
01600037959POPcx 
01700037A8BD0MOVdx,ax 
01800037C58POPax 
01900037D03C2ADDax,dx 
0210003885EL2: POPsi 
0220003895DPOPbp 
02300038AC3RET  
024000383B80100L1: MOVax,1 
025000386EB00JMPL2 
 proc_1ENDP   
      
 mainPROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD83EC04SUBsp,4 
00300030056PUSHsi 
00400030157PUSHdi 
005000302B89401MOVax,194h 
00600030550PUSHax 
007000306E8080CCALLnear ptr printf 
00800030959POPcx 
00900030A8D46FCLEAax,[bp-4] 
01000030D50PUSHax 
01100030EB8B101MOVax,1B1h 
01200031150PUSHax 
013000312E88514CALLnear ptr scanf 
01400031559POPcx 
01500031659POPcx 
016000317BE0100MOVsi,1 
0180003493B76FCL3: CMPsi,[bp-4] 
01900034C7ECEJLEL4 
02000034E33C0XORax,ax 
02100035050PUSHax 
022000351E87300CALLnear ptr exit 
02300035459POPcx 
0240003555FPOPdi 
0250003565EPOPsi 
0260003578BE5MOVsp,bp 
0270003595DPOPbp 
02800035AC3RET  
02900031CB8B401L4: MOVax,1B4h 
03000031F50PUSHax 
031000320E8EE0BCALLnear ptr printf 
03200032359POPcx 
0330003248D46FELEAax,[bp-2] 
03400032750PUSHax 
035000328B8C301MOVax,1C3h 
03600032B50PUSHax 
03700032CE86B14CALLnear ptr scanf 
03800032F59POPcx 
03900033059POPcx 
040000331FF76FEPUSHword ptr [bp-2] 
041000334E82400CALLnear ptr proc_1 
04200033759POPcx 
0430003388BF8MOVdi,ax 
04400033A57PUSHdi 
04500033BFF76FEPUSHword ptr [bp-2] 
04600033EB8C601MOVax,1C6h 
04700034150PUSHax 
048000342E8CC0BCALLnear ptr printf 
04900034583C406ADDsp,6 
05000034846INCsi 
051  JMPL3;Synthetic inst
 mainENDP   

图 9-43: Fibo.a2

/*

* Input file : fibo.exe

* File type : EXE

*/

#include "dcc.h"

int proc_1 (int arg0)

/* Takes 2 bytes of parameters.

* High-level language prologue code.

* C calling convention.

*/

{

int loc1;

int loc2; /* ax */

loc1 = arg0;

if (loc1 > 2) {

loc2 = (proc_1 ((loc1 - 1)) + proc_1 ((loc1 + -2)));

}

else {

loc2 = 1;

}

return (loc2);

}

void main ()

/* Takes no parameters.

* High-level language prologue code.

*/

{

int loc1; int loc2;

int loc3; int loc4;

printf ("Input number of iterations: ");

scanf ("%d", &loc1);

loc3 = 1;

while ((loc3 <= loc1)) {

printf ("Input number: ");

scanf ("%d", &loc2);

loc4 = proc_1 (loc2);

printf ("fibonacci(%d) = %u\n", loc2, loc4);

loc3 = (loc3 + 1);

}

exit (0);

}

图 9-44: Fibo.b

#include <stdio.h>

int main()

{ int i, numtimes, number;

unsigned value, fib();

printf("Input number of iterations: ");

scanf ("%d", &numtimes);

for (i = 1; i <= numtimes; i++)

{

printf ("Input number: ");

scanf ("%d", &number);

value = fib(number);

printf("fibonacci(%d) = %u\n", number, value);

}

exit(0);

}

unsigned fib(x) /* compute fibonacci number recursively */

int x;

{

if (x > 2)

return (fib(x - 1) + fib(x - 2));

else

return (1);

}

图 9-45: Fibo.c

子程序

低级

高级

% 缩减率

proc_1

26

5

80.77

main

52

10

80.77

合计

78

15

80.77

图 9-46: Fibo 统计

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文