第 9 章 dcc - Byteops.exe
9.7.2 Byteops.exe
Byteops 是一个与 intops 类似的程序,差别在于这两个变量是字节并非整型数。反汇编的程序见图 9-18 所示,反编译的 C 版本在图 9-19,最初的 C 程序在图 9-20。该程序有下列调用图:
main printf |
从程序的反汇编可知,局部变量被放在栈的偏移-1 和-2 上。和 intops.a2 程序相比,这个程序多出 22.41%的指令,因为有些机器指令比如 IDIV 取字寄存器作为操作数而不是用字节寄存器;因此,字节寄存器或被填补或被符号扩展以形成一个字寄存器。两个程序中最后的高级指令数目是相同的,因此在这个程序里面中间指令数目的缩减率比较大。它达到 82.76%,如图 9-21 所示。
main | PROC NEAR | ||||
000 | 0002FA | 55 | PUSH | bp | |
001 | 0002FB | 8BEC | MOV | bp,sp | |
002 | 0002FD | 83EC02 | SUB | sp,2 | |
003 | 000300 | C646FEFF | MOV | byte ptr [bp-2],0FFh | |
004 | 000304 | C646FF8F | MOV | byte ptr [bp-1],8Fh | |
005 | 000308 | 8A46FE | MOV | al,[bp-2] | |
006 | 00030B | 0246FF | ADD | al,[bp-1] | |
007 | 00030E | 8846FF | MOV | [bp-1],al | |
008 | 000311 | 8A46FE | MOV | al,[bp-2] | |
009 | 000314 | 2A46FF | SUB | al,[bp-1] | |
010 | 000317 | 8846FE | MOV | [bp-2],al | |
011 | 00031A | 8A46FE | MOV | al,[bp-2] | |
012 | 00031D | B400 | MOV | ah,0 | |
013 | 00031F | 8A56FF | MOV | dl,[bp-1] | |
014 | 000322 | B600 | MOV | dh,0 | |
015 | 000324 | F7E2 | MUL | dx | |
016 | 000326 | 8846FE | MOV | [bp-2],al | |
017 | 000329 | 8A46FF | MOV | al,[bp-1] | |
018 | 00032C | B400 | MOV | ah,0 | |
019 | 00032E | 8A56FE | MOV | dl,[bp-2] | |
020 | 000331 | B600 | MOV | dh,0 | |
021 | 000333 | 8BDA | MOV | bx,dx | |
022 | 000335 | 99 | CWD | ||
023 | MOV | tmp,dx:ax | ;Synthetic inst | ||
024 | 000336 | F7FB | IDIV | bx | |
025 | MOD | bx | ;Synthetic inst | ||
026 | 000338 | 8846FF | MOV | [bp-1],al | |
027 | 00033B | 8A46FF | MOV | al,[bp-1] | |
028 | 00033E | B400 | MOV | ah,0 | |
029 | 000340 | 8A56FE | MOV | dl,[bp-2] | |
030 | 000343 | B600 | MOV | dh,0 | |
031 | 000345 | 8BDA | MOV | bx,dx | |
032 | 000347 | 99 | CWD | ||
033 | MOV | tmp,dx:ax | ;Synthetic inst | ||
034 | 000348 | F7FB | IDIV | bx | |
035 | MOD | bx | ;Synthetic inst | ||
036 | 00034A | 8856FF | MOV | [bp-1],dl | |
037 | 00034D | 8A46FE | MOV | al,[bp-2] | |
038 | 000350 | B105 | MOV | cl,5 | |
039 | 000352 | D2E0 | SHL | al,cl | |
040 | 000354 | 8846FE | MOV | [bp-2],al | |
041 | 000357 | 8A46FF | MOV | al,[bp-1] | |
042 | 00035A | 8A4EFE | MOV | cl,[bp-2] | |
043 | 00035D | D2E8 | SHR | al,cl | |
044 | 00035F | 8846FF | MOV | [bp-1],al | |
045 | 000362 | 8A46FF | MOV | al,[bp-1] | |
046 | 000365 | B400 | MOV | ah,0 | |
047 | 000367 | 50 | PUSH | ax | |
048 | 000368 | 8A46FE | MOV | al,[bp-2] | |
049 | 00036B | B400 | MOV | ah,0 | |
050 | 00036D | 50 | PUSH | ax | |
051 | 00036E | B89401 | MOV | ax,194h | |
052 | 000371 | 50 | PUSH | ax | |
053 | 000372 | E8AB06 | CALL | near ptr printf | |
054 | 000375 | 83C406 | ADD | sp,6 | |
055 | 000378 | 8BE5 | MOV | sp,bp | |
056 | 00037A | 5D | POP | bp | |
057 | 00037B | C3 | RET | ||
main | ENDP |
图 9-18: Byteops.a2
/* * Input file : byteops.exe * File type : EXE */ #include "dcc.h" void main () /* Takes no parameters. * High-level language prologue code. */ { int loc1; int loc2; loc1 = 255; loc2 = 143; loc2 = (loc1 + loc2); loc1 = (loc1 - loc2); loc1 = (loc1 * loc2); loc2 = (loc2 / loc1); loc2 = (loc2 % loc1); loc1 = (loc1 << 5); loc2 = (loc2 >> loc1); printf ("a = %d, b = %d\n", loc1, loc2); } |
图 9-19: Byteops.b
#define TYPE unsigned char main() { TYPE a, b; a = 255; b = 143; b = a + b; a = a - b; a = a * b; b = b / a; b = b % a; a = a << 5; b = b >> a; printf ("a = %d, b = %d\n", a, b); } |
图 9-20: Byteops.c
子程序 | 低级 | 高级 | % 缩减率 |
main | 58 | 10 | 82.76 |
合计 | 58 | 10 | 82.76 |
图 9-21: Byteops 统计
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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