返回介绍

第 9 章 dcc - Byteops.exe

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

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 所示。

 mainPROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD83EC02SUBsp,2 
003000300C646FEFFMOVbyte ptr [bp-2],0FFh 
004000304C646FF8FMOVbyte ptr [bp-1],8Fh 
0050003088A46FEMOVal,[bp-2] 
00600030B0246FFADDal,[bp-1] 
00700030E8846FFMOV[bp-1],al 
0080003118A46FEMOVal,[bp-2] 
0090003142A46FFSUBal,[bp-1] 
0100003178846FEMOV[bp-2],al 
01100031A8A46FEMOVal,[bp-2] 
01200031DB400MOVah,0 
01300031F8A56FFMOVdl,[bp-1] 
014000322B600MOVdh,0 
015000324F7E2MULdx 
0160003268846FEMOV[bp-2],al 
0170003298A46FFMOVal,[bp-1] 
01800032CB400MOVah,0 
01900032E8A56FEMOVdl,[bp-2] 
020000331B600MOVdh,0 
0210003338BDAMOVbx,dx 
02200033599CWD  
023  MOVtmp,dx:ax;Synthetic inst
024000336F7FBIDIVbx 
025  MODbx;Synthetic inst
0260003388846FFMOV[bp-1],al 
02700033B8A46FFMOVal,[bp-1] 
02800033EB400MOVah,0 
0290003408A56FEMOVdl,[bp-2] 
030000343B600MOVdh,0 
0310003458BDAMOVbx,dx 
03200034799CWD  
033  MOVtmp,dx:ax;Synthetic inst
034000348F7FBIDIVbx 
035  MODbx;Synthetic inst
03600034A8856FFMOV[bp-1],dl 
03700034D8A46FEMOVal,[bp-2] 
038000350B105MOVcl,5 
039000352D2E0SHLal,cl 
0400003548846FEMOV[bp-2],al 
0410003578A46FFMOVal,[bp-1] 
04200035A8A4EFEMOVcl,[bp-2] 
04300035DD2E8SHRal,cl 
04400035F8846FFMOV[bp-1],al 
0450003628A46FFMOVal,[bp-1] 
046000365B400MOVah,0 
04700036750PUSHax 
0480003688A46FEMOVal,[bp-2] 
04900036BB400MOVah,0 
05000036D50PUSHax 
05100036EB89401MOVax,194h 
05200037150PUSHax 
053000372E8AB06CALLnear ptr printf 
05400037583C406ADDsp,6 
0550003788BE5MOVsp,bp 
05600037A5DPOPbp 
05700037BC3RET  
 mainENDP   

图 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 技术交流群。

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

发布评论

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