返回介绍

第 9 章 dcc - Benchmul.exe

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

9.7.6 Benchmul.exe

Benchmul 是另一个来自 Plum-Hall 基准程序套装的程序。这个程序测试在一个循环中执行 1000 次相乘的整数乘法。反汇编的程序在图 9-35 被显示,反编译的 C 程序在图 9-36,最初的 C 程序图 9-37。这个程序有下列调用图:

main

scanf

printf

Benchmul 使用两个长整型变量经过程序许多次循环,和三个执行该运算的整型变量;这些变量其中一个实际上在该程序中没有被使用。从反汇编的代码可知,长整型变量位于栈上偏移-4 和-8 处,而整型变量在偏移-12、-10 和寄存器变量 si 上。最后的 C 代码和最初的 C 代码是相同的,而且这个程序达到 86.36%的指令缩减率,如图 9-38 所示。

 mainPROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD83EC0CSUBsp,0Ch 
00300030056PUSHsi 
0040003018D46FCLEAax,[bp-4] 
00500030450PUSHax 
006000305B89401MOVax,194h 
00700030850PUSHax 
008000309E8D014CALLnear ptr scanf 
00900030C59POPcx 
01000030D59POPcx 
01100030EFF76FEPUSHword ptr [bp-2] 
012000311FF76FCPUSHword ptr [bp-4] 
013000314B89801MOVax,198h 
01400031750PUSHax 
015000318E8380CCALLnear ptr printf 
01600031B83C406ADDsp,6 
01700031E8D46F4LEAax,[bp-0Ch] 
01800032150PUSHax 
019000322B8B201MOVax,1B2h 
02000032550PUSHax 
021000326E8B314CALLnear ptr scanf 
02200032959POPcx 
02300032A59POPcx 
02400032B8D46F6LEAax,[bp-0Ah] 
02500032E50PUSHax 
02600032FB8B501MOVax,1B5h 
02700033250PUSHax 
028000333E8A614CALLnear ptr scanf 
02900033659POPcx 
03000033759POPcx 
031000338C746FA0000MOVword ptr [bp-6],0 
03200033DC746F80100MOVword ptr [bp-8],1 
0340003AA8B56FAL1: MOVdx,[bp-6] 
0350003AD8B46F8MOVax,[bp-8] 
0360003B03B56FECMPdx,[bp-2] 
0370003B37C8FJLL2 
0380003B57F05JGL3 
0390003B73B46FCCMPax,[bp-4] 
0400003BA7688JBEL2 
0410003BCFF76F4L3: PUSHword ptr [bp-0Ch] 
0420003BFB8B801MOVax,1B8h 
0430003C250PUSHax 
0440003C3E88D0BCALLnear ptr printf 
0450003C659POPcx 
0460003C759POPcx 
0470003C85EPOPsi 
0480003C98BE5MOVsp,bp 
0490003CB5DPOPbp 
0500003CCC3RET  
051000344BE0100L2: MOVsi,1 
05300039D83FE28L4: CMPsi,28h 
0540003A07EA7JLEL5 
0550003A28346F801ADDword ptr [bp-8],1 
0560003A68356FA00ADCword ptr [bp-6],0 
057  JMPL1;Synthetic inst
0580003498B46F4L5: MOVax,[bp-0Ch] 
05900034CF766F4MULword ptr [bp-0Ch] 
06000034FF766F4MULword ptr [bp-0Ch] 
061000352F766F4MULword ptr [bp-0Ch] 
062000355F766F4MULword ptr [bp-0Ch] 
063000358F766F4MULword ptr [bp-0Ch] 
06400035BF766F4MULword ptr [bp-0Ch] 
06500035EF766F4MULword ptr [bp-0Ch] 
066000361F766F4MULword ptr [bp-0Ch] 
067000364F766F4MULword ptr [bp-0Ch] 
068000367F766F4MULword ptr [bp-0Ch] 
06900036AF766F4MULword ptr [bp-0Ch] 
07000036DF766F4MULword ptr [bp-0Ch] 
071000370F766F4MULword ptr [bp-0Ch] 
072000373F766F4MULword ptr [bp-0Ch] 
073000376F766F4MULword ptr [bp-0Ch] 
074000379F766F4MULword ptr [bp-0Ch] 
07500037CF766F4MULword ptr [bp-0Ch] 
07600037FF766F4MULword ptr [bp-0Ch] 
077000382F766F4MULword ptr [bp-0Ch] 
078000385F766F4MULword ptr [bp-0Ch] 
079000388F766F4MULword ptr [bp-0Ch] 
08000038BF766F4MULword ptr [bp-0Ch] 
08100038EF766F4MULword ptr [bp-0Ch] 
082000391F766F4MULword ptr [bp-0Ch] 
083000394BA0300MOVdx,3 
084000397F7E2MULdx 
0850003998946F4MOV[bp-0Ch],ax 
08600039C46INCsi 
087  JMPL4;Synthetic inst
 mainENDP   

图 9-35: Benchmul.a2

/*

* Input file : benchmul.exe

* File type : EXE

*/

#include "dcc.h"

void main ()

/* Takes no parameters.

* High-level language prologue code.

*/

{

int loc1;

int loc2;

long loc3;

long loc4;

int loc5;

scanf ("%ld", &loc4);

printf ("executing %ld iterations\n", loc4);

scanf ("%d", &loc1);

scanf ("%d", &loc2);

loc3 = 1;

while ((loc3 <= loc4)) {

loc5 = 1;

while ((loc5 <= 40)) {

loc1 = (((((((((((((((((((((((((loc1 * loc1) * loc1) * loc1)

* loc1) * loc1) * loc1) * loc1) * loc1) * loc1) *

loc1) * loc1) * loc1) * loc1) * loc1) * loc1) * loc1)

* loc1) * loc1) * loc1) * loc1) * loc1) * loc1) *

loc1) * loc1) * 3);

loc5 = (loc5 + 1);

}

loc3 = (loc3 + 1);

}

printf ("a=%d\n", loc1);

}

图 9-36: Benchmul.b

/* benchmul - benchmark for int multiply

* Thomas Plum, Plum Hall Inc, 609-927-3770

* If machine traps overflow, use an unsigned type

* Let T be the execution time in milliseconds

* Then average time per operator = T/major usec

* (Because the inner loop has exactly 1000 operations)

*/

#define STOR_CL auto

#define TYPE int

#include <stdio.h>

main (int ac, char *av[])

{ STOR_CL TYPE a, b, c;

long d, major;

scanf ("%ld", &major);

printf("executing %ld iterations\n", major);

scanf ("%d", &a);

scanf ("%d", &b);

for (d = 1; d <= major; ++d)

{

/* inner loop executes 1000 selected operations */

for (c = 1; c <= 40; ++c)

{

a = 3 *a*a*a*a*a*a*a*a * a*a*a*a*a*a*a*a *

a*a*a*a*a*a*a*a * a; /* 25 * */

}

}

printf("a=%d\n", a);

}

图 9-37: Benchmul.c

子程序

低级

高级

% 缩减率

main

88

12

86.36

合计

88

12

86.36

图 9-38: Benchmul 统计

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

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

发布评论

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