返回介绍

第 9 章 dcc - Matrixmu

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

9.7.10 Matrixmu.exe

Matrixmu 是一个矩阵相乘的程序。这个程序在某种意义上是不完整的,它没有初始化矩阵,但是把它反编译了用以说明第 5 章第 5.4.10 节的向前代入法能够发现数组表示法。dcc 没有实现从这个表示法到数组的转换,但是在第 5 章第 5.5 节有详细解释。反汇编的程序在图 9-51 中显示,反编译的 C 程序在图 9-52,最初的 C 程序在图 9-53。这个程序的调用图如下:

main

proc_1

两个用户子过程都以相同的高级指令数被反编译;矩阵乘法子过程有 10 个,主程序有 1 个。指令数目的缩减率超过 85%,归因于在一个数组偏移的计算中涉及大量低级指令。在程序的反汇编版本中,在子程序 proc_1 第 026 行到第 069 行上的基本块有 44 个指令,它们被转换成两个高级指令;中间指令缩减率 95.45%。整体来说,这个程序的中间指令有 86.90%的缩减率,如图 9-54 所示。

 proc_1PROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD83EC02SUBsp,2 
00300030056PUSHsi 
00400030157PUSHdi 
00500030233F6XORsi,si 
00700037883FE05L1: CMPsi,5 
00800037B7C89JLL2 
00900037D5FPOPdi 
01000037E5EPOPsi 
01100037F8BE5MOVsp,bp 
0120003815DPOPbp 
013000382C3RET  
01400030633FFL2: XORdi,di 
01600037283FF04L3: CMPdi,4 
0170003757C93JLL4 
01800037746INCsi 
019  JMPL1;Synthetic inst
02000030AC746FE0000L4: MOVword ptr [bp-2],0 
02200036B837EFE04L5: CMPword ptr [bp-2],4 
02300036F7CA0JLL6 
02400037147INCdi 
025  JMPL3;Synthetic inst
0260003118BDEL6: MOVbx,si 
027000313D1E3SHLbx,1 
028000315D1E3SHLbx,1 
029000317D1E3SHLbx,1 
030000319035E04ADDbx,[bp+4] 
03100031C8B46FEMOVax,[bp-2] 
03200031FD1E0SHLax,1 
03300032103D8ADDbx,ax 
0340003238B07MOVax,[bx] 
03500032550PUSHax 
0360003268B46FEMOVax,[bp-2] 
037000329BA0A00MOVdx,0Ah 
03800032CF7E2MULdx 
03900032E8BD8MOVbx,ax 
040000330035E06ADDbx,[bp+6] 
0410003338BC7MOVax,di 
042000335D1E0SHLax,1 
04300033703D8ADDbx,ax 
04400033958POPax 
04500033AF727MULword ptr [bx] 
04600033C50PUSHax 
04700033D8BC6MOVax,si 
04800033FBA0A00MOVdx,0Ah 
049000342F7E2MULdx 
0500003448BD8MOVbx,ax 
051000346035E08ADDbx,[bp+8] 
0520003498BC7MOVax,di 
05300034BD1E0SHLax,1 
05400034D03D8ADDbx,ax 
05500034F58POPax 
0560003500307ADDax,[bx] 
05700035250PUSHax 
0580003538BC6MOVax,si 
059000355BA0A00MOVdx,0Ah 
060000358F7E2MULdx 
06100035A8BD8MOVbx,ax 
06200035C035E08ADDbx,[bp+8] 
06300035F8BC7MOVax,di 
064000361D1E0SHLax,1 
06500036303D8ADDbx,ax 
06600036558POPax 
0670003668907MOV[bx],ax 
068000368FF46FEINCword ptr [bp-2] 
069  JMPL5;Synthetic inst
 proc_1ENDP   
      
 mainPROC NEAR   
00000038355PUSHbp 
0010003848BECMOVbp,sp 
00200038683EC78SUBsp,78h 
0030003898D46D8LEAax,[bp-28h] 
00400038C50PUSHax 
00500038D8D46B0LEAax,[bp-50h] 
00600039050PUSHax 
0070003918D4688LEAax,[bp-78h] 
00800039450PUSHax 
009000395E862FFCALLnear ptr proc_1 
01000039883C406ADDsp,6 
01100039B8BE5MOVsp,bp 
01200039D5DPOPbp 
01300039EC3RET  
 mainENDP   

图 9-51: Matrixmu.a2

/*

* Input file : matrixmu.exe

* File type : EXE

*/

#include "dcc.h"

void proc_1 (int arg0, int arg1, int arg2)

/* Takes 6 bytes of parameters.

* High-level language prologue code.

* C calling convention.

*/

{

int loc1;

int loc2;

int loc3;

loc2 = 0;

while ((loc2 < 5)) {

loc3 = 0;

while ((loc3 < 4)) {

loc1 = 0;

while ((loc1 < 4)) {

*((((loc2 * 10) + arg2) + (loc3 << 1))) =

((*((((loc2 << 3) + arg0) + (loc1 << 1))) *

*((((loc1 * 10) + arg1) + (loc3 << 1)))) +

*((((loc2 * 10) + arg2) + (loc3 << 1))));

loc1 = (loc1 + 1);

}

loc3 = (loc3 + 1);

}

loc2 = (loc2 + 1);

}

}

void main ()

/* Takes no parameters.

* High-level language prologue code.

*/

{

int loc1;

int loc2;

int loc3;

proc_1 (&loc3, &loc2, &loc1);

}

图 9-52: Matrixmu.b

#define n 5

#define m 4

static void multMatrix (int a[n][m], int b[m][n], int c[n][n])

{ int i,j,k;

for (i=0; i<n; i++)

for (j=0; j<m; j++)

for (k=0; k<m; k++)

c[i][j] = a[i][k] * b[k][j] + c[i][j];

}

main()

{ int a[n][m], b[n][m], c[n][m];

multMatrix (a, b, c);

}

图 9-53: Matrixmu.c

子程序

低级

高级

% 缩减率

proc_1

70

10

85.71

main

14

1

92.86

合计

84

11

86.90

图 9-54: Matrixmu Statistics

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

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

发布评论

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