第 9 章 dcc - Benchmul.exe
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 所示。
main | PROC NEAR | ||||
000 | 0002FA | 55 | PUSH | bp | |
001 | 0002FB | 8BEC | MOV | bp,sp | |
002 | 0002FD | 83EC0C | SUB | sp,0Ch | |
003 | 000300 | 56 | PUSH | si | |
004 | 000301 | 8D46FC | LEA | ax,[bp-4] | |
005 | 000304 | 50 | PUSH | ax | |
006 | 000305 | B89401 | MOV | ax,194h | |
007 | 000308 | 50 | PUSH | ax | |
008 | 000309 | E8D014 | CALL | near ptr scanf | |
009 | 00030C | 59 | POP | cx | |
010 | 00030D | 59 | POP | cx | |
011 | 00030E | FF76FE | PUSH | word ptr [bp-2] | |
012 | 000311 | FF76FC | PUSH | word ptr [bp-4] | |
013 | 000314 | B89801 | MOV | ax,198h | |
014 | 000317 | 50 | PUSH | ax | |
015 | 000318 | E8380C | CALL | near ptr printf | |
016 | 00031B | 83C406 | ADD | sp,6 | |
017 | 00031E | 8D46F4 | LEA | ax,[bp-0Ch] | |
018 | 000321 | 50 | PUSH | ax | |
019 | 000322 | B8B201 | MOV | ax,1B2h | |
020 | 000325 | 50 | PUSH | ax | |
021 | 000326 | E8B314 | CALL | near ptr scanf | |
022 | 000329 | 59 | POP | cx | |
023 | 00032A | 59 | POP | cx | |
024 | 00032B | 8D46F6 | LEA | ax,[bp-0Ah] | |
025 | 00032E | 50 | PUSH | ax | |
026 | 00032F | B8B501 | MOV | ax,1B5h | |
027 | 000332 | 50 | PUSH | ax | |
028 | 000333 | E8A614 | CALL | near ptr scanf | |
029 | 000336 | 59 | POP | cx | |
030 | 000337 | 59 | POP | cx | |
031 | 000338 | C746FA0000 | MOV | word ptr [bp-6],0 | |
032 | 00033D | C746F80100 | MOV | word ptr [bp-8],1 | |
034 | 0003AA | 8B56FA | L1: MOV | dx,[bp-6] | |
035 | 0003AD | 8B46F8 | MOV | ax,[bp-8] | |
036 | 0003B0 | 3B56FE | CMP | dx,[bp-2] | |
037 | 0003B3 | 7C8F | JL | L2 | |
038 | 0003B5 | 7F05 | JG | L3 | |
039 | 0003B7 | 3B46FC | CMP | ax,[bp-4] | |
040 | 0003BA | 7688 | JBE | L2 | |
041 | 0003BC | FF76F4 | L3: PUSH | word ptr [bp-0Ch] | |
042 | 0003BF | B8B801 | MOV | ax,1B8h | |
043 | 0003C2 | 50 | PUSH | ax | |
044 | 0003C3 | E88D0B | CALL | near ptr printf | |
045 | 0003C6 | 59 | POP | cx | |
046 | 0003C7 | 59 | POP | cx | |
047 | 0003C8 | 5E | POP | si | |
048 | 0003C9 | 8BE5 | MOV | sp,bp | |
049 | 0003CB | 5D | POP | bp | |
050 | 0003CC | C3 | RET | ||
051 | 000344 | BE0100 | L2: MOV | si,1 | |
053 | 00039D | 83FE28 | L4: CMP | si,28h | |
054 | 0003A0 | 7EA7 | JLE | L5 | |
055 | 0003A2 | 8346F801 | ADD | word ptr [bp-8],1 | |
056 | 0003A6 | 8356FA00 | ADC | word ptr [bp-6],0 | |
057 | JMP | L1 | ;Synthetic inst | ||
058 | 000349 | 8B46F4 | L5: MOV | ax,[bp-0Ch] | |
059 | 00034C | F766F4 | MUL | word ptr [bp-0Ch] | |
060 | 00034F | F766F4 | MUL | word ptr [bp-0Ch] | |
061 | 000352 | F766F4 | MUL | word ptr [bp-0Ch] | |
062 | 000355 | F766F4 | MUL | word ptr [bp-0Ch] | |
063 | 000358 | F766F4 | MUL | word ptr [bp-0Ch] | |
064 | 00035B | F766F4 | MUL | word ptr [bp-0Ch] | |
065 | 00035E | F766F4 | MUL | word ptr [bp-0Ch] | |
066 | 000361 | F766F4 | MUL | word ptr [bp-0Ch] | |
067 | 000364 | F766F4 | MUL | word ptr [bp-0Ch] | |
068 | 000367 | F766F4 | MUL | word ptr [bp-0Ch] | |
069 | 00036A | F766F4 | MUL | word ptr [bp-0Ch] | |
070 | 00036D | F766F4 | MUL | word ptr [bp-0Ch] | |
071 | 000370 | F766F4 | MUL | word ptr [bp-0Ch] | |
072 | 000373 | F766F4 | MUL | word ptr [bp-0Ch] | |
073 | 000376 | F766F4 | MUL | word ptr [bp-0Ch] | |
074 | 000379 | F766F4 | MUL | word ptr [bp-0Ch] | |
075 | 00037C | F766F4 | MUL | word ptr [bp-0Ch] | |
076 | 00037F | F766F4 | MUL | word ptr [bp-0Ch] | |
077 | 000382 | F766F4 | MUL | word ptr [bp-0Ch] | |
078 | 000385 | F766F4 | MUL | word ptr [bp-0Ch] | |
079 | 000388 | F766F4 | MUL | word ptr [bp-0Ch] | |
080 | 00038B | F766F4 | MUL | word ptr [bp-0Ch] | |
081 | 00038E | F766F4 | MUL | word ptr [bp-0Ch] | |
082 | 000391 | F766F4 | MUL | word ptr [bp-0Ch] | |
083 | 000394 | BA0300 | MOV | dx,3 | |
084 | 000397 | F7E2 | MUL | dx | |
085 | 000399 | 8946F4 | MOV | [bp-0Ch],ax | |
086 | 00039C | 46 | INC | si | |
087 | JMP | L4 | ;Synthetic inst | ||
main | ENDP |
图 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论