[英]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.