【问题标题】:Delphi 6 to Delphi 2007德尔福 6 到德尔福 2007
【发布时间】:2015-03-22 16:41:01
【问题描述】:

经过多年的代码更新,只是碰上了各种砖墙,但目前我似乎无法转换的是这个

Function Pack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
  Push  DS
  Mov   BX, Count                               { BX = Count }
  Mov   AX, Word Ptr Dest
  Mov   DI, AX
  Mov   AX, Word Ptr Dest+2           `1`
  Mov   ES, AX                                  { ES:DI - Dest }
  Mov   AX, Word Ptr Source
  Mov   SI, AX
  Mov   AX, Word Ptr Source+2
  Mov   DS, AX                                  { DS:SI - Source }
  Xor   DX, DX                                  { Packed size }
  CLD
@Cycle:
  Or    BX, BX
  JZ    @End                                    { Done }
  LODSB
  Mov   CX, BX
  Cmp   CX, 100H
  JC    @1
  Mov   CX, 0FFH
@1:
  Mov   AH, CL
  Push  ES
  Push  DI                                      { Save ES:DI before scan }
  Push  SI
  Pop   DI
  Push  DS
  Pop   ES                                      { ES:DI = DS:SI for scan }
  RepE  ScaSB
  Dec   DI
  Push  DI
  Pop   SI
  Push  ES
  Pop   DS                                      { DS:SI = ES:DI for next }
  Pop   DI
  Pop   ES                                      { Restore ES:DI after scan }
  Sub   AH, CL
  Mov   CL, AH                                  { CX = repeat count }
  Cmp   AH, 3
  JNC   @3                                      { Repeat count >= 3 }
  Cmp   AL, RP
  JNE   @2                                      { Not a RepeatPrefix byte }
  STOSW                                         { Save RP, repeat count < 3 }
  Sub   BX, CX                                  { Actually count in source }
  Add   DX, 2                                   { Actually packed size }
  Jmp   @Cycle
@2:
  Sub   BX, CX                                  { Actually count in source }
  Add   DX, CX                                  { Actually packed size }
  Rep   STOSB                                   { Save bytes }
  Jmp   @Cycle
@3:
  Sub   BX, CX                                  { Actually count in source }
  Add   DX, 3                                   { Actually packed size }
  Mov   CL, AL
  Mov   AL, RP
  STOSW                                         { Save RP, repeat count < 3 }
  Mov   AL, CL
  STOSB                                         { Save repeating byte }
  Jmp   @Cycle
@End:
  Pop   DS
  Mov   AX, DX                                  { Return packed size }
End;

Function UnPack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
  Push  DS
  Mov   BX, Count                               { BX = Count }
  Mov   AX, Word Ptr Dest
  Mov   DI, AX
  Mov   AX, Word Ptr Dest+2
  Mov   ES, AX                                  { ES:DI - Dest }
  Mov   AX, Word Ptr Source
  Mov   SI, AX
  Mov   AX, Word Ptr Source+2
  Mov   DS, AX                                  { DS:SI - Source }
  Xor   DX, DX                                  { Packed size }
  Xor   AH, AH
  CLD
@Cycle:
  Or    BX, BX
  JZ    @End                                    { Done }
  LODSB
  Dec   BX
  Cmp   AL, RP
  JE    @1
  STOSB
  Inc   DX
  Jmp   @Cycle
@1:
  LODSB
  Mov   CX, AX
  Add   DX, CX
  Dec   BX
  Cmp   AL, 3
  JNC   @2
  Mov   AL, RP
  Rep   STOSB
  Jmp   @Cycle
@2:
  LODSB
  Dec   BX
  Rep   STOSB
  Jmp   @Cycle
@End:
  Pop   DS
  Mov   AX, DX
End;
[DCC 错误] Packer.pas(20): E2107 操作数大小不匹配“Mov AX, Word Ptr Dest” [DCC 错误] Packer.pas(22): E2105 内联汇编语法错误“Mov AX, Word Ptr Dest+2 `1`” [DCC 错误] Packer.pas(24): E2107 操作数大小不匹配“Mov AX, Word Ptr Source” [DCC 错误] Packer.pas(87): E2107 操作数大小不匹配“Mov AX, Word Ptr Dest” [DCC 错误] Packer.pas(91): E2107 操作数大小不匹配“Mov AX, Word Ptr Source”

我在 d6 上花了很多年,我做错了什么?

【问题讨论】:

  • 代码也不能在 Delphi 6 中编译。请发布在 Delphi 6 中编译的代码。您真正应该做的是摆脱您无法理解的 asm。使用 Pascal 编写程序,让编译器完成剩下的工作。 Delphi 6 -> Delphi 2007 是一个相当奇怪的升级。我看不出你现在会选择做什么。
  • 这家公司落入新人手中,想要进行现代化改造,自从我加入公司以来,我从来没有重新编译 dcu,所以把它当作是好的。将采取我的第一个行动回到那里为抬头欢呼
  • 看起来更像是 Turbo Pascal 程序集。
  • @David D6 -> D2007 并不奇怪。这是对最新的 pre-unicode 版本的升级。切换到 unicode 会带来一系列复杂性。在需要遵守与外部系统的通信协议的应用程序中更是如此。在我们的案例中,我们使用 D2007 作为更新版本的垫脚石。
  • @CraigYoung 我想每个人的情况都不一样,但我的经验是,通过 D2007 会比像我们那样直接从 D6 到 D2010 需要更多的工作。

标签: delphi delphi-2007 delphi-6


【解决方案1】:

作为一般规则,在 Delphi 6 中编译的内联汇编代码也将在以后的版本中编译。所以不需要移植。实际上,当您尝试在 Delphi 6 中编译此代码时,它会失败并出现与您从 D2007 报告的完全相同的错误。

您还在 cmets 中提到您没有在 Delphi 6 中编译代码,而是使用已编译的 .dcu 文件。考虑到问题中的代码无法在 Delphi 6 中编译,这更有意义。

代码在 Delphi 6 中无法编译的原因是它不是 32 位代码。在我看来是 16 位代码。

字里行间我怀疑你的代码可以追溯到很久以前,在 16 位时代。当代码移至 32 位时,有人移植了代码,但给您留下了 .dcu 文件而不是源代码。

你因此陷入困境。在不知道这个 .dcu 文件中有什么内容的情况下,您要做什么?你确定 .dcu 文件和这个 16 位汇编代码一样吗?你有这些功能的功能规范吗?

在理想情况下,您会知道这些函数的作用,并且能够将它们移植到 Pascal。那么您将不再受汇编代码的束缚。

如果您不知道这些功能的用途,您应该了解一下。我不相信您的 16 位汇编器与您的 .dcu 文件的功能相匹配。我会反汇编 .dcu 文件并将其移植到 Pascal。

如果这太难了,那么权宜之计是使用 Delphi 6 将 .dcu 文件编译成 DLL。然后您可以从您移植的 D20007 程序中调用这些函数。这将起作用,但它让您不再了解您的代码的作用。

【讨论】:

    【解决方案2】:

    是的,它是 16 位寄存器。

    只是一个想法,可能在变量示例中将 AX 声明为单词,将 AH、AL 声明为字节,但您需要重命名它们。

    例子...

       Function Example (Var Source, Dest; Count : Word) : Word; Assembler;
        var
         iAX, iBX, iCX, iDX, iBP, iSI, iDI, iSP: Word;
         iAH, iAL, iBH, iBL, iCH, iCL, iDH, iDL : Byte
        Asm
          Push  DS
          Mov   iBX, Count                              
          Mov   iAX, Word Ptr Dest
          Mov   iDI, iAX
          Mov   iAX, Word Ptr Dest+2
          Mov   iES, iAX 
    .......
    

    附言 您可能需要将“Push DS”和“POP DS”更改为“PUSH ESI”和“POP ESI”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多