第 9 章 dcc - Longops.exe
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 | ||||
000 | 001269 | 80F910 | CMP | cl,10h | |
001 | 00126C | 7310 | JAE | L1 | |
002 | 00126E | 8BDA | MOV | bx,dx | |
003 | 001270 | D3E8 | SHR | ax,cl | |
004 | 001272 | D3FA | SAR | dx,cl | |
005 | 001274 | F6D9 | NEG | cl | |
006 | 001276 | 80C110 | ADD | cl,10h | |
007 | 001279 | D3E3 | SHL | bx,cl | |
008 | 00127B | 0BC3 | OR | ax,bx | |
009 | 00127D | CB | RETF | ||
010 | 00127E | 80E910 | L1: SUB | cl,10h | |
011 | 001281 | 8BC2 | MOV | ax,dx | |
012 | 001283 | 99 | CWD | ||
013 | 001284 | D3F8 | SAR | ax,cl | |
014 | 001286 | CB | RETF | ||
LXRSH@ | ENDP | ||||
LXLSH@ | PROC FAR | ||||
000 | 001287 | 80F910 | CMP | cl,10h | |
001 | 00128A | 7310 | JAE | L2 | |
002 | 00128C | 8BD8 | MOV | bx,ax | |
003 | 00128E | D3E0 | SHL | ax,cl | |
004 | 001290 | D3E2 | SHL | dx,cl | |
005 | 001292 | F6D9 | NEG | cl | |
006 | 001294 | 80C110 | ADD | cl,10h | |
007 | 001297 | D3EB | SHR | bx,cl | |
008 | 001299 | 0BD3 | OR | dx,bx | |
009 | 00129B | CB | RETF | ||
010 | 00129C | 80E910 | L2: SUB | cl,10h | |
011 | 00129F | 8BD0 | MOV | dx,ax | |
012 | 0012A1 | 33C0 | XOR | ax,ax | |
013 | 0012A3 | D3E2 | SHL | dx,cl | |
014 | 0012A5 | CB | RETF | ||
LXLSH@ | ENDP | ||||
LMOD@ | PROC FAR | ||||
000 | 0011CF | B90200 | MOV | cx,2 | |
002 | 0011D7 | 55 | PUSH | bp | |
003 | 0011D8 | 56 | PUSH | si | |
004 | 0011D9 | 57 | PUSH | di | |
005 | 0011DA | 8BEC | MOV | bp,sp | |
006 | 0011DC | 8BF9 | MOV | di,cx | |
007 | 0011DE | 8B460A | MOV | ax,[bp+0Ah] | |
008 | 0011E1 | 8B560C | MOV | dx,[bp+0Ch] | |
009 | 0011E4 | 8B5E0E | MOV | bx,[bp+0Eh] | |
010 | 0011E7 | 8B4E10 | MOV | cx,[bp+10h] | |
011 | 0011EA | 0BC9 | OR | cx,cx | |
012 | 0011EC | 7508 | JNE | L3 | |
013 | 0011EE | 0BD2 | OR | dx,dx | |
014 | 0011F0 | 7469 | JE | L4 | |
015 | 0011F2 | 0BDB | OR | bx,bx | |
016 | 0011F4 | 7465 | JE | L4 | |
017 | 0011F6 | F7C70100 | L3: TEST | di,1 | |
018 | 0011FA | 751C | JNE | L5 | |
019 | 0011FC | 0BD2 | OR | dx,dx | |
020 | 0011FE | 790A | JNS | L6 | |
021 | 001200 | F7DA | NEG | dx | |
022 | 001202 | F7D8 | NEG | ax | |
023 | 001204 | 83DA00 | SBB | dx,0 | |
024 | 001207 | 83CF0C | OR | di,0Ch | |
025 | 00120A | 0BC9 | L6: OR | cx,cx | |
026 | 00120C | 790A | JNS | L5 | |
027 | 00120E | F7D9 | NEG | cx | |
028 | 001210 | F7DB | NEG | bx | |
029 | 001212 | 83D900 | SBB | cx,0 | |
030 | 001215 | 83F704 | XOR | di,4 | |
031 | 001218 | 8BE9 | L5: MOV | bp,cx | |
032 | 00121A | B92000 | MOV | cx,20h | |
033 | 00121D | 57 | PUSH | di | |
034 | 00121E | 33FF | XOR | di,di | |
035 | 001220 | 33F6 | XOR | si,si | |
036 | 001222 | D1E0 | L7: SHL | ax,1 | |
037 | 001224 | D1D2 | RCL | dx,1 | |
038 | 001226 | D1D6 | RCL | si,1 | |
039 | 001228 | D1D7 | RCL | di,1 | |
040 | 00122A | 3BFD | CMP | di,bp | |
041 | 00122C | 720B | JB | L8 | |
042 | 00122E | 7704 | JA | L9 | |
043 | 001230 | 3BF3 | CMP | si,bx | |
044 | 001232 | 7205 | JB | L8 | |
045 | 001234 | 2BF3 | L9: SUB | si,bx | |
046 | 001236 | 1BFD | SBB | di,bp | |
047 | 001238 | 40 | INC | ax | |
048 | 001239 | E2E7 | L8: LOOP | L7 | |
049 | 00123B | 5B | POP | bx | |
050 | 00123C | F7C30200 | TEST | bx,2 | |
051 | 001240 | 7406 | JE | L10 | |
052 | 001242 | 8BC6 | MOV | ax,si | |
053 | 001244 | 8BD7 | MOV | dx,di | |
054 | 001246 | D1EB | SHR | bx,1 | |
055 | 001248 | F7C30400 | L10: TEST | bx,4 | |
056 | 00124C | 7407 | JE | L11 | |
057 | 00124E | F7DA | NEG | dx | |
058 | 001250 | F7D8 | NEG | ax | |
059 | 001252 | 83DA00 | SBB | dx,0 | |
060 | 001255 | 5F | L11: POP | di | |
061 | 001256 | 5E | POP | si | |
062 | 001257 | 5D | POP | bp | |
063 | 001258 | CA0800 | RETF | 8 | |
064 | L4: MOV | tmp,dx:ax | ;Synthetic inst | ||
065 | 00125B | F7F3 | DIV | bx | |
066 | MOD | bx | ;Synthetic inst | ||
067 | 00125D | F7C70200 | TEST | di,2 | |
068 | 001261 | 7402 | JE | L12 | |
069 | 001263 | 8BC2 | MOV | ax,dx | |
070 | 001265 | 33D2 | L12: XOR | dx,dx | |
071 | 001267 | EBEC | JMP | L11 | |
LMOD@ | ENDP | ||||
LDIV@ | PROC FAR | ||||
000 | 0011C6 | 33C9 | XOR | cx,cx | |
002 | 0011D7 | 55 | PUSH | bp | |
003 | 0011D8 | 56 | PUSH | si | |
004 | 0011D9 | 57 | PUSH | di | |
005 | 0011DA | 8BEC | MOV | bp,sp | |
006 | 0011DC | 8BF9 | MOV | di,cx | |
007 | 0011DE | 8B460A | MOV | ax,[bp+0Ah] | |
008 | 0011E1 | 8B560C | MOV | dx,[bp+0Ch] | |
009 | 0011E4 | 8B5E0E | MOV | bx,[bp+0Eh] | |
010 | 0011E7 | 8B4E10 | MOV | cx,[bp+10h] | |
011 | 0011EA | 0BC9 | OR | cx,cx | |
012 | 0011EC | 7508 | JNE | L13 | |
013 | 0011EE | 0BD2 | OR | dx,dx | |
014 | 0011F0 | 7469 | JE | L14 | |
015 | 0011F2 | 0BDB | OR | bx,bx | |
016 | 0011F4 | 7465 | JE | L14 | |
017 | 0011F6 | F7C70100 | L13: TEST | di,1 | |
018 | 0011FA | 751C | JNE | L15 | |
019 | 0011FC | 0BD2 | OR | dx,dx | |
020 | 0011FE | 790A | JNS | L16 | |
021 | 001200 | F7DA | NEG | dx | |
022 | 001202 | F7D8 | NEG | ax | |
023 | 001204 | 83DA00 | SBB | dx,0 | |
024 | 001207 | 83CF0C | OR | di,0Ch | |
025 | 00120A | 0BC9 | L16: OR | cx,cx | |
026 | 00120C | 790A | JNS | L15 | |
027 | 00120E | F7D9 | NEG | cx | |
028 | 001210 | F7DB | NEG | bx | |
029 | 001212 | 83D900 | SBB | cx,0 | |
030 | 001215 | 83F704 | XOR | di,4 | |
031 | 001218 | 8BE9 | L15: MOV | bp,cx | |
032 | 00121A | B92000 | MOV | cx,20h | |
033 | 00121D | 57 | PUSH | di | |
034 | 00121E | 33FF | XOR | di,di | |
035 | 001220 | 33F6 | XOR | si,si | |
036 | 001222 | D1E0 | L17: SHL | ax,1 | |
037 | 001224 | D1D2 | RCL | dx,1 | |
038 | 001226 | D1D6 | RCL | si,1 | |
039 | 001228 | D1D7 | RCL | di,1 | |
040 | 00122A | 3BFD | CMP | di,bp | |
041 | 00122C | 720B | JB | L18 | |
042 | 00122E | 7704 | JA | L19 | |
043 | 001230 | 3BF3 | CMP | si,bx | |
044 | 001232 | 7205 | JB | L18 | |
045 | 001234 | 2BF3 | L19: SUB | si,bx | |
046 | 001236 | 1BFD | SBB | di,bp | |
047 | 001238 | 40 | INC | ax | |
048 | 001239 | E2E7 | L18: LOOP | L17 | |
049 | 00123B | 5B | POP | bx | |
050 | 00123C | F7C30200 | TEST | bx,2 | |
051 | 001240 | 7406 | JE | L20 | |
052 | 001242 | 8BC6 | MOV | ax,si | |
053 | 001244 | 8BD7 | MOV | dx,di | |
054 | 001246 | D1EB | SHR | bx,1 | |
055 | 001248 | F7C30400 | L20: TEST | bx,4 | |
056 | 00124C | 7407 | JE | L21 | |
057 | 00124E | F7DA | NEG | dx | |
058 | 001250 | F7D8 | NEG | ax | |
059 | 001252 | 83DA00 | SBB | dx,0 | |
060 | 001255 | 5F | L21: POP | di | |
061 | 001256 | 5E | POP | si | |
062 | 001257 | 5D | POP | bp | |
063 | 001258 | CA0800 | RETF | 8 | |
064 | L14: MOV | tmp,dx:ax | ;Synthetic inst | ||
065 | 00125B | F7F3 | DIV | bx | |
066 | MOD | bx | ;Synthetic inst | ||
067 | 00125D | F7C70200 | TEST | di,2 | |
068 | 001261 | 7402 | JE | L22 | |
069 | 001263 | 8BC2 | MOV | ax,dx | |
070 | 001265 | 33D2 | L22: XOR | dx,dx | |
071 | 001267 | EBEC | JMP | L21 | |
LDIV@ | ENDP | ||||
LXMUL@ | PROC FAR | ||||
000 | 0009C3 | 56 | PUSH | si | |
001 | MOV | tmp,ax | ;Synthetic inst | ||
002 | MOV | ax,si | ;Synthetic inst | ||
003 | MOV | si,tmp | ;Synthetic inst | ||
004 | MOV | tmp,ax | ;Synthetic inst | ||
005 | MOV | ax,dx | ;Synthetic inst | ||
006 | MOV | dx,tmp | ;Synthetic inst | ||
007 | 0009C6 | 85C0 | TEST | ax,ax | |
008 | 0009C8 | 7402 | JE | L23 | |
009 | 0009CA | F7E3 | MUL | bx | |
010 | L23: MOV | tmp,ax | ;Synthetic inst | ||
011 | MOV | ax,cx | ;Synthetic inst | ||
012 | MOV | cx,tmp | ;Synthetic inst | ||
013 | 0009CD | 85C0 | TEST | ax,ax | |
014 | 0009CF | 7404 | JE | L24 | |
015 | 0009D1 | F7E6 | MUL | si | |
016 | 0009D3 | 03C8 | ADD | cx,ax | |
017 | L24: MOV | tmp,ax | ;Synthetic inst | ||
018 | MOV | ax,si | ;Synthetic inst | ||
019 | MOV | si,tmp | ;Synthetic inst | ||
020 | 0009D6 | F7E3 | MUL | bx | |
021 | 0009D8 | 03D1 | ADD | dx,cx | |
022 | 0009DA | 5E | POP | si | |
023 | 0009DB | CB | RETF | ||
LXMUL@ | ENDP | ||||
main | PROC NEAR | ||||
000 | 0002FA | 55 | PUSH | bp | |
001 | 0002FB | 8BEC | MOV | bp,sp | |
002 | 0002FD | 83EC08 | SUB | sp,8 | |
003 | 000300 | C746FA0000 | MOV | word ptr [bp-6],0 | |
004 | 000305 | C746F8FF00 | MOV | word ptr [bp-8],0FFh | |
005 | 00030A | C746FE0000 | MOV | word ptr [bp-2],0 | |
006 | 00030F | C746FC8F00 | MOV | word ptr [bp-4],8Fh | |
007 | 000314 | 8B56FA | MOV | dx,[bp-6] | |
008 | 000317 | 8B46F8 | MOV | ax,[bp-8] | |
009 | 00031A | 0346FC | ADD | ax,[bp-4] | |
010 | 00031D | 1356FE | ADC | dx,[bp-2] | |
011 | 000320 | 8956FE | MOV | [bp-2],dx | |
012 | 000323 | 8946FC | MOV | [bp-4],ax | |
013 | 000326 | 8B56FA | MOV | dx,[bp-6] | |
014 | 000329 | 8B46F8 | MOV | ax,[bp-8] | |
015 | 00032C | 2B46FC | SUB | ax,[bp-4] | |
016 | 00032F | 1B56FE | SBB | dx,[bp-2] | |
017 | 000332 | 8956FA | MOV | [bp-6],dx | |
018 | 000335 | 8946F8 | MOV | [bp-8],ax | |
019 | 000338 | 8B56FA | MOV | dx,[bp-6] | |
020 | 00033B | 8B46F8 | MOV | ax,[bp-8] | |
021 | 00033E | 8B4EFE | MOV | cx,[bp-2] | |
022 | 000341 | 8B5EFC | MOV | bx,[bp-4] | |
023 | 000344 | 9AC3081000 | CALL | far ptr LXMUL@ | |
024 | 000349 | 8956FA | MOV | [bp-6],dx | |
025 | 00034C | 8946F8 | MOV | [bp-8],ax | |
026 | 00034F | FF76FA | PUSH | word ptr [bp-6] | |
027 | 000352 | FF76F8 | PUSH | word ptr [bp-8] | |
028 | 000355 | FF76FE | PUSH | word ptr [bp-2] | |
029 | 000358 | FF76FC | PUSH | word ptr [bp-4] | |
030 | 00035B | 9AC6101000 | CALL | far ptr LDIV@ | |
031 | 000360 | 8956FE | MOV | [bp-2],dx | |
032 | 000363 | 8946FC | MOV | [bp-4],ax | |
033 | 000366 | FF76FA | PUSH | word ptr [bp-6] | |
034 | 000369 | FF76F8 | PUSH | word ptr [bp-8] | |
035 | 00036C | FF76FE | PUSH | word ptr [bp-2] | |
036 | 00036F | FF76FC | PUSH | word ptr [bp-4] | |
037 | 000372 | 9ACF101000 | CALL | far ptr LMOD@ | |
038 | 000377 | 8956FE | MOV | [bp-2],dx | |
039 | 00037A | 8946FC | MOV | [bp-4],ax | |
040 | 00037D | 8B56FA | MOV | dx,[bp-6] | |
041 | 000380 | 8B46F8 | MOV | ax,[bp-8] | |
042 | 000383 | B105 | MOV | cl,5 | |
043 | 000385 | 9A87111000 | CALL | far ptr LXLSH@ | |
044 | 00038A | 8956FA | MOV | [bp-6],dx | |
045 | 00038D | 8946F8 | MOV | [bp-8],ax | |
046 | 000390 | 8B56FE | MOV | dx,[bp-2] | |
047 | 000393 | 8B46FC | MOV | ax,[bp-4] | |
048 | 000396 | 8A4EF8 | MOV | cl,[bp-8] | |
049 | 000399 | 9A69111000 | CALL | far ptr LXRSH@ | |
050 | 00039E | 8956FE | MOV | [bp-2],dx | |
051 | 0003A1 | 8946FC | MOV | [bp-4],ax | |
052 | 0003A4 | FF76FE | PUSH | word ptr [bp-2] | |
053 | 0003A7 | FF76FC | PUSH | word ptr [bp-4] | |
054 | 0003AA | FF76FA | PUSH | word ptr [bp-6] | |
055 | 0003AD | FF76F8 | PUSH | word ptr [bp-8] | |
056 | 0003B0 | B89401 | MOV | ax,194h | |
057 | 0003B3 | 50 | PUSH | ax | |
058 | 0003B4 | E8C406 | CALL | near ptr printf | |
059 | 0003B7 | 83C40A | ADD | sp,0Ah | |
060 | 0003BA | 8BE5 | MOV | sp,bp | |
061 | 0003BC | 5D | POP | bp | |
062 | 0003BD | C3 | RET | ||
main | ENDP |
图 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 技术交流群。

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