返回介绍

第 9 章 dcc - Longops.exe

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

9.7.3 Longops.exe

longops 程序跟 intops 和 byteops 程序类似,不过它使用两个长整型变量。反汇编的程序见图 9-22 所示,反编译的 C 程序在图 9-23,最初的 C 程序在图 9-24。程序有下列调用图:

main

LXMUL@

LDIV@

LMOD@

LXLSH@

LXRSH@

printf

长整型变量的运算使用成语和编译器的运行时支持例程。在这个程序中,长整型的加法和减法是由第 4 章第 4.2.1 节的成语执行,而运行时例程 LXMUL@, LDIV@, LMOD@, LXLSH@, 和 LXRSH@各被用于长整型的乘法、除法、求余、左移位、和右移位。从这些运行时例程,长整型乘法、左移位、和右移位是可以被翻译成 C 语言的;在某些情况下使用宏来存取一个变量的低字部分或高字部分。除法和求模例程无法被翻译成 C 语言,所以为它们生成汇编程序。长整型变量被放在栈中偏移量-4 和-8 上 (见 main 子程序)。主程序比 intops 程序多出 28.57%的指令、而比 byteops 程序多出 7.9%的指令。指令数目增加的原因有两个:首先,长整型变量到寄存器的传送要用两个指令而不是一个指令 (即,高字部分和低字部份被传送到不同的寄存器),其次,对运行时支持例程的子程序调用指令。由于中间指令数目的缩减率 84.13%,最后反编译的主程序仍然产生与前面两个程序相同数目的高级指令,如图 9-25 所示。总的指令数目缩减率是 58.97%,这么低是归功于被翻译成 C 语言的运行时例程,它们没有做大量的寄存器移动,因为参数已在寄存器中而且这些例程最初是用汇编语言编写。

 LXRSH@PROC FAR   
00000126980F910CMPcl,10h 
00100126C7310JAEL1 
00200126E8BDAMOVbx,dx 
003001270D3E8SHRax,cl 
004001272D3FASARdx,cl 
005001274F6D9NEGcl 
00600127680C110ADDcl,10h 
007001279D3E3SHLbx,cl 
00800127B0BC3ORax,bx 
00900127DCBRETF  
01000127E80E910L1: SUBcl,10h 
0110012818BC2MOVax,dx 
01200128399CWD  
013001284D3F8SARax,cl 
014001286CBRETF  
 LXRSH@ENDP   
      
 LXLSH@PROC FAR   
00000128780F910CMPcl,10h 
00100128A7310JAEL2 
00200128C8BD8MOVbx,ax 
00300128ED3E0SHLax,cl 
004001290D3E2SHLdx,cl 
005001292F6D9NEGcl 
00600129480C110ADDcl,10h 
007001297D3EBSHRbx,cl 
0080012990BD3ORdx,bx 
00900129BCBRETF  
01000129C80E910L2: SUBcl,10h 
01100129F8BD0MOVdx,ax 
0120012A133C0XORax,ax 
0130012A3D3E2SHLdx,cl 
0140012A5CBRETF  
 LXLSH@ENDP   
      
 LMOD@PROC FAR   
0000011CFB90200MOVcx,2 
0020011D755PUSHbp 
0030011D856PUSHsi 
0040011D957PUSHdi 
0050011DA8BECMOVbp,sp 
0060011DC8BF9MOVdi,cx 
0070011DE8B460AMOVax,[bp+0Ah] 
0080011E18B560CMOVdx,[bp+0Ch] 
0090011E48B5E0EMOVbx,[bp+0Eh] 
0100011E78B4E10MOVcx,[bp+10h] 
0110011EA0BC9ORcx,cx 
0120011EC7508JNEL3 
0130011EE0BD2ORdx,dx 
0140011F07469JEL4 
0150011F20BDBORbx,bx 
0160011F47465JEL4 
0170011F6F7C70100L3: TESTdi,1 
0180011FA751CJNEL5 
0190011FC0BD2ORdx,dx 
0200011FE790AJNSL6 
021001200F7DANEGdx 
022001202F7D8NEGax 
02300120483DA00SBBdx,0 
02400120783CF0CORdi,0Ch 
02500120A0BC9L6: ORcx,cx 
02600120C790AJNSL5 
02700120EF7D9NEGcx 
028001210F7DBNEGbx 
02900121283D900SBBcx,0 
03000121583F704XORdi,4 
0310012188BE9L5: MOVbp,cx 
03200121AB92000MOVcx,20h 
03300121D57PUSHdi 
03400121E33FFXORdi,di 
03500122033F6XORsi,si 
036001222D1E0L7: SHLax,1 
037001224D1D2RCLdx,1 
038001226D1D6RCLsi,1 
039001228D1D7RCLdi,1 
04000122A3BFDCMPdi,bp 
04100122C720BJBL8 
04200122E7704JAL9 
0430012303BF3CMPsi,bx 
0440012327205JBL8 
0450012342BF3L9: SUBsi,bx 
0460012361BFDSBBdi,bp 
04700123840INCax 
048001239E2E7L8: LOOPL7 
04900123B5BPOPbx 
05000123CF7C30200TESTbx,2 
0510012407406JEL10 
0520012428BC6MOVax,si 
0530012448BD7MOVdx,di 
054001246D1EBSHRbx,1 
055001248F7C30400L10: TESTbx,4 
05600124C7407JEL11 
05700124EF7DANEGdx 
058001250F7D8NEGax 
05900125283DA00SBBdx,0 
0600012555FL11: POPdi 
0610012565EPOPsi 
0620012575DPOPbp 
063001258CA0800RETF8 
064  L4: MOVtmp,dx:ax;Synthetic inst
06500125BF7F3DIVbx 
066  MODbx;Synthetic inst
06700125DF7C70200TESTdi,2 
0680012617402JEL12 
0690012638BC2MOVax,dx 
07000126533D2L12: XORdx,dx 
071001267EBECJMPL11 
 LMOD@ENDP   
      
 LDIV@PROC FAR   
0000011C633C9XORcx,cx 
0020011D755PUSHbp 
0030011D856PUSHsi 
0040011D957PUSHdi 
0050011DA8BECMOVbp,sp 
0060011DC8BF9MOVdi,cx 
0070011DE8B460AMOVax,[bp+0Ah] 
0080011E18B560CMOVdx,[bp+0Ch] 
0090011E48B5E0EMOVbx,[bp+0Eh] 
0100011E78B4E10MOVcx,[bp+10h] 
0110011EA0BC9ORcx,cx 
0120011EC7508JNEL13 
0130011EE0BD2ORdx,dx 
0140011F07469JEL14 
0150011F20BDBORbx,bx 
0160011F47465JEL14 
0170011F6F7C70100L13: TESTdi,1 
0180011FA751CJNEL15 
0190011FC0BD2ORdx,dx 
0200011FE790AJNSL16 
021001200F7DANEGdx 
022001202F7D8NEGax 
02300120483DA00SBBdx,0 
02400120783CF0CORdi,0Ch 
02500120A0BC9L16: ORcx,cx 
02600120C790AJNSL15 
02700120EF7D9NEGcx 
028001210F7DBNEGbx 
02900121283D900SBBcx,0 
03000121583F704XORdi,4 
0310012188BE9L15: MOVbp,cx 
03200121AB92000MOVcx,20h 
03300121D57PUSHdi 
03400121E33FFXORdi,di 
03500122033F6XORsi,si 
036001222D1E0L17: SHLax,1 
037001224D1D2RCLdx,1 
038001226D1D6RCLsi,1 
039001228D1D7RCLdi,1 
04000122A3BFDCMPdi,bp 
04100122C720BJBL18 
04200122E7704JAL19 
0430012303BF3CMPsi,bx 
0440012327205JBL18 
0450012342BF3L19: SUBsi,bx 
0460012361BFDSBBdi,bp 
04700123840INCax 
048001239E2E7L18: LOOPL17 
04900123B5BPOPbx 
05000123CF7C30200TESTbx,2 
0510012407406JEL20 
0520012428BC6MOVax,si 
0530012448BD7MOVdx,di 
054001246D1EBSHRbx,1 
055001248F7C30400L20: TESTbx,4 
05600124C7407JEL21 
05700124EF7DANEGdx 
058001250F7D8NEGax 
05900125283DA00SBBdx,0 
0600012555FL21: POPdi 
0610012565EPOPsi 
0620012575DPOPbp 
063001258CA0800RETF8 
064  L14: MOVtmp,dx:ax;Synthetic inst
06500125BF7F3DIVbx 
066  MODbx;Synthetic inst
06700125DF7C70200TESTdi,2 
0680012617402JEL22 
0690012638BC2MOVax,dx 
07000126533D2L22: XORdx,dx 
071001267EBECJMPL21 
 LDIV@ENDP   
      
 LXMUL@PROC FAR   
0000009C356PUSHsi 
001  MOVtmp,ax;Synthetic inst
002  MOVax,si;Synthetic inst
003  MOVsi,tmp;Synthetic inst
004  MOVtmp,ax;Synthetic inst
005  MOVax,dx;Synthetic inst
006  MOVdx,tmp;Synthetic inst
0070009C685C0TESTax,ax 
0080009C87402JEL23 
0090009CAF7E3MULbx 
010  L23: MOVtmp,ax;Synthetic inst
011  MOVax,cx;Synthetic inst
012  MOVcx,tmp;Synthetic inst
0130009CD85C0TESTax,ax 
0140009CF7404JEL24 
0150009D1F7E6MULsi 
0160009D303C8ADDcx,ax 
017  L24: MOVtmp,ax;Synthetic inst
018  MOVax,si;Synthetic inst
019  MOVsi,tmp;Synthetic inst
0200009D6F7E3MULbx 
0210009D803D1ADDdx,cx 
0220009DA5EPOPsi 
0230009DBCBRETF  
 LXMUL@ENDP   
      
 mainPROC NEAR   
0000002FA55PUSHbp 
0010002FB8BECMOVbp,sp 
0020002FD83EC08SUBsp,8 
003000300C746FA0000MOVword ptr [bp-6],0 
004000305C746F8FF00MOVword ptr [bp-8],0FFh 
00500030AC746FE0000MOVword ptr [bp-2],0 
00600030FC746FC8F00MOVword ptr [bp-4],8Fh 
0070003148B56FAMOVdx,[bp-6] 
0080003178B46F8MOVax,[bp-8] 
00900031A0346FCADDax,[bp-4] 
01000031D1356FEADCdx,[bp-2] 
0110003208956FEMOV[bp-2],dx 
0120003238946FCMOV[bp-4],ax 
0130003268B56FAMOVdx,[bp-6] 
0140003298B46F8MOVax,[bp-8] 
01500032C2B46FCSUBax,[bp-4] 
01600032F1B56FESBBdx,[bp-2] 
0170003328956FAMOV[bp-6],dx 
0180003358946F8MOV[bp-8],ax 
0190003388B56FAMOVdx,[bp-6] 
02000033B8B46F8MOVax,[bp-8] 
02100033E8B4EFEMOVcx,[bp-2] 
0220003418B5EFCMOVbx,[bp-4] 
0230003449AC3081000CALLfar ptr LXMUL@ 
0240003498956FAMOV[bp-6],dx 
02500034C8946F8MOV[bp-8],ax 
02600034FFF76FAPUSHword ptr [bp-6] 
027000352FF76F8PUSHword ptr [bp-8] 
028000355FF76FEPUSHword ptr [bp-2] 
029000358FF76FCPUSHword ptr [bp-4] 
03000035B9AC6101000CALLfar ptr LDIV@ 
0310003608956FEMOV[bp-2],dx 
0320003638946FCMOV[bp-4],ax 
033000366FF76FAPUSHword ptr [bp-6] 
034000369FF76F8PUSHword ptr [bp-8] 
03500036CFF76FEPUSHword ptr [bp-2] 
03600036FFF76FCPUSHword ptr [bp-4] 
0370003729ACF101000CALLfar ptr LMOD@ 
0380003778956FEMOV[bp-2],dx 
03900037A8946FCMOV[bp-4],ax 
04000037D8B56FAMOVdx,[bp-6] 
0410003808B46F8MOVax,[bp-8] 
042000383B105MOVcl,5 
0430003859A87111000CALLfar ptr LXLSH@ 
04400038A8956FAMOV[bp-6],dx 
04500038D8946F8MOV[bp-8],ax 
0460003908B56FEMOVdx,[bp-2] 
0470003938B46FCMOVax,[bp-4] 
0480003968A4EF8MOVcl,[bp-8] 
0490003999A69111000CALLfar ptr LXRSH@ 
05000039E8956FEMOV[bp-2],dx 
0510003A18946FCMOV[bp-4],ax 
0520003A4FF76FEPUSHword ptr [bp-2] 
0530003A7FF76FCPUSHword ptr [bp-4] 
0540003AAFF76FAPUSHword ptr [bp-6] 
0550003ADFF76F8PUSHword ptr [bp-8] 
0560003B0B89401MOVax,194h 
0570003B350PUSHax 
0580003B4E8C406CALLnear ptr printf 
0590003B783C40AADDsp,0Ah 
0600003BA8BE5MOVsp,bp 
0610003BC5DPOPbp 
0620003BDC3RET  
 mainENDP   

图 9-22: Longops.a2

/*

* Input file : longops.exe

* File type : EXE

*/

#include "dcc.h"

long LXMUL@ (long arg0, long arg1)

/* Uses register arguments:

* arg0 = dx:ax.

* arg1 = cx:bx.

* Runtime support routine of the compiler.

*/

{

int loc1;

int loc2; /* tmp */

loc2 = LO(arg0);

LO(arg0) = loc1;

loc1 = loc2;

loc2 = LO(arg0);

LO(arg0) = HI(arg0);

if ((LO(arg0) & LO(arg0)) != 0) {

LO(arg0) = (LO(arg0) * LO(arg1));

}

loc2 = LO(arg0);

LO(arg0) = HI(arg1);

HI(arg1) = loc2;

if ((LO(arg0) & LO(arg0)) != 0) {

LO(arg0) = (LO(arg0) * loc1);

HI(arg1) = (HI(arg1) + LO(arg0));

}

loc2 = LO(arg0);

LO(arg0) = loc1;

loc1 = loc2;

arg0 = (LO(arg0) * LO(arg1));

HI(arg0) = (HI(arg0) + HI(arg1));

return (arg0);

}

long LDIV@ (long arg0, long arg2)

/* Takes 8 bytes of parameters.

* Runtime support routine of the compiler.

* Untranslatable routine. Assembler provided.

* Return value in registers dx:ax.

* Pascal calling convention.

*/

{

/* disassembly code here */

}

long LMOD@ (long arg0, long arg2)

/* Takes 8 bytes of parameters.

* Runtime support routine of the compiler.

* Untranslatable routine. Assembler provided.

* Return value in registers dx:ax.

* Pascal calling convention.

*/

{

/* disassembly code here */

}

long LXLSH@ (long arg0, char arg1)

/* Uses register arguments:

* arg0 = dx:ax.

* arg1 = cl.

* Runtime support routine of the compiler.

*/

{

int loc1; /* bx */

if (arg1 < 16) {

loc1 = LO(arg0);

LO(arg0) = (LO(arg0) << arg1);

HI(arg0) = (HI(arg0) << arg1);

HI(arg0) = (HI(arg0) | (loc1 >> (!arg1 + 16)));

return (arg0);

}

else {

HI(arg0) = LO(arg0);

LO(arg0) = 0;

HI(arg0) = (HI(arg0) << (arg1 - 16));

return (arg0);

}

}

long LXRSH@ (long arg0, char arg1)

/* Uses register arguments:

* arg0 = dx:ax.

* arg1 = cl.

* Runtime support routine of the compiler.

*/

{

int loc1; /* bx */

if (arg1 < 16) {

loc1 = HI(arg0);

LO(arg0) = (LO(arg0) >> arg1);

HI(arg0) = (HI(arg0) >> arg1);

LO(arg0) = (LO(arg0) | (loc1 << (!arg1 + 16)));

return (arg0);

}

else {

arg0 = HI(arg0);

LO(arg0) = (LO(arg0) >> (arg1 - 16));

return (arg0);

}

}

void main ()

/* Takes no parameters.

* High-level language prologue code.

*/

{

long loc1;

long loc2;

loc2 = 255;

loc1 = 143;

loc1 = (loc2 + loc1);

loc2 = (loc2 - loc1);

loc2 = LXMUL@ (loc2, loc1);

loc1 = LDIV@ (loc1, loc2);

loc1 = LMOD@ (loc1, loc2);

loc2 = LXLSH@ (loc2, 5);

loc1 = LXRSH@ (loc1, loc1);

printf ("a = %ld, b = %ld\n", loc2, loc1);

}

图 9-23: Longops.b

#define TYPE long

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 = %ld, b = %ld\n", a, b);

}

图 9-24: Longops.c

子程序

低级

高级

% 缩减率

LXMUL@

24

19

20.83

LDIV@

72

-

-

LMOD@

72

-

-

LXLSH@

15

10

33.33

LXRSH@

15

94

0.00

main

63

10

84.13

合计

117

48

58.97

图 9-25: Longops 统计

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

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

发布评论

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