簡體   English   中英

Delphi 6至Delphi 2007

[英]Delphi 6 to Delphi 2007

僅僅花費了數年的代碼更新時間就碰到了各種各樣的磚牆,但是我目前似乎無法轉換的是

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 Error] Packer.pas(20): E2107 Operand size mismatch  "  Mov   AX, Word Ptr Dest"
[DCC Error] Packer.pas(22): E2105 Inline assembler syntax error"  Mov   AX, Word Ptr Dest+2           `1`"
[DCC Error] Packer.pas(24): E2107 Operand size mismatch "Mov   AX, Word Ptr Source"
[DCC Error] Packer.pas(87): E2107 Operand size mismatch"  Mov   AX, Word Ptr Dest"
[DCC Error] Packer.pas(91): E2107 Operand size mismatch "  Mov   AX, Word Ptr Source"

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

通常,在Delphi 6中編譯的內聯匯編代碼也將在以后的版本中進行編譯。 因此,無需移植。 確實,當您嘗試在Delphi 6中編譯此代碼時,它會失敗,並返回與D2007中報告的錯誤完全相同的錯誤。

您還在注釋中提到,您尚未在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程序中調用這些功能。 這將起作用,但是它使您離知道代碼的作用更近了。

是的,它是16位寄存器。

在此處輸入圖片說明

只是一個想法,也許在變量示例中將AX聲明為word,將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 
.......

Ps您可能必須將“推送DS”和“ POP DS”更改為“ PUSH ESI”和“ POP ESI”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM